PHP多线程类及用法实例


Posted in PHP onDecember 03, 2014

本文实例讲述了PHP多线程类及用法。分享给大家供大家参考。具体分析如下:

一般来说可通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程.

但不管怎么样,它还是能满足我们的一些需要的,在需要类似多线程的功能方面还是可以采用这个类,代码如下:

/** 

* @title: PHP多线程类(Thread) 

* @version: 1.0 

* 

* PHP多线程应用示例: 

* require_once 'thread.class.php'; 

* $thread = new thread(); 

* $thread->addthread('action_log','a'); 

* $thread->addthread('action_log','b'); 

* $thread->addthread('action_log','c'); 

* $thread->runthread(); 

* 

* function action_log($info) { 

* $log = 'log/' . microtime() . '.log'; 

* $txt = $info . "rnrn" . 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn"; 

* $fp = fopen($log, 'w'); 

* fwrite($fp, $txt); 

* fclose($fp); 

* } 

*/ 

class thread { 

var $hooks = array(); 

var $args = array(); 

function thread() { 

} 

function addthread($func) 

{ 

$args = array_slice(func_get_args(), 1); 

$this->hooks[] = $func; 

$this->args[] = $args; 

return true; 

} 

function runthread() 

{ 

if(isset($_GET['flag'])) 

{ 

$flag = intval($_GET['flag']); 

} 

if($flag || $flag === 0) 

{ 

call_user_func_array($this->hooks[$flag], $this->args[$flag]); 

} 

else 

{ 

for($i = 0, $size = count($this->hooks); $i < $size; $i++) 

{ 

$fp=fsockopen($_SERVER['HTTP_HOST'],$_SERVER['SERVER_PORT']); 

if($fp) 

{ 

$out = "GET {$_SERVER['PHP_SELF']}?flag=$i HTTP/1.1rn"; 

$out .= "Host: {$_SERVER['HTTP_HOST']}rn"; 

$out .= "Connection: Closernrn"; 

fputs($fp,$out); 

fclose($fp); 

} 

} 

} 

} 

}

使用方法,代码如下:
$thread = new thread(); 

$thread->addthread('func1','info1'); 

$thread->addthread('func2','info2'); 

$thread->addthread('func3','info3'); 

$thread->runthread();

说明:

addthread() 是添加线程函数,第一个参数是函数名,之后的参数(可选)为传递给指定函数的参数.

runthread() 是执行线程的函数.

PHP实例:利用curl实现多线程下载图片

其实是php利用curl实现的一个多线程类,有了这个类,我们也可利用该类执行多线程任务了,代码如下:

class curl_multi{  

    private $url_list=array();  

    private $curl_setopt=array(  

        'CURLOPT_RETURNTRANSFER' => 1,//结果返回给变量  

        'CURLOPT_HEADER' => 0,//是否需要返回HTTP头  

        'CURLOPT_NOBODY' => 0,//是否需要返回的内容  

        'CURLOPT_FOLLOWLOCATION' => 0,//自动跟踪  

        'CURLOPT_TIMEOUT' => 6//超时时间(s)  

    );  

    function __construct($seconds=30){  

        set_time_limit($seconds);  

    }  

    /*  

     * 设置网址  

     * @list 数组  

     */  

    public function setUrlList($list=array()){  

        $this->url_list=$list;  

    }  

    /*  

     * 设置参数  

     * @cutPot array  

     */  

    public function setOpt($cutPot){  

        $this->curl_setopt=$cutPot+$this->curl_setopt;  

    }  

    /*  

     * 执行  

     * @return array  

     */  

    public function execute(){  

        $mh=curl_multi_init();  

        foreach($this->url_list as $i=>$url){  

            $conn[$i]=curl_init($url);  

            foreach($this->curl_setopt as $key => $val){  

                curl_setopt($conn[$i],preg_replace('/(CURLOPT_w{1,})/ie','$0',$key),$val);  

            }  

            curl_multi_add_handle($mh,$conn[$i]);  

        }  

        $active=false;  

        do{  

            $mrc=curl_multi_exec($mh,$active);  

        }while($mrc == CURLM_CALL_MULTI_PERFORM);  

  

        while($active and $mrc == CURLM_OK){  

            if(curl_multi_select($mh) != -1){  

                do{  

                    $mrc=curl_multi_exec($mh,$active);  

                }while($mrc == CURLM_CALL_MULTI_PERFORM);  

            }  

        }  

        $res=array();  

        foreach($this->url_list as $i => $url){  

            $res[$i]=curl_multi_getcontent($conn[$i]);  

            curl_close($conn[$i]);  

            curl_multi_remove_handle($mh,$conn[$i]);//释放资源    

        }  

        curl_multi_close($mh);  

        return $res;  

    }  

}

php使用多线程下载类示例,下载远程图片,代码如下:
$curl_mul=new curl_multi();  

$curl_mul->setUrlList(array('https://3water.com/img/logo.jpg','https://3water.com/img/logo.jpg','https://3water.com/img/logo.jpg'));  

$a=$curl_mul->execute();  

$i=1;  

foreach($a as $v){  

        $filename=$i.'.gif';  

        $fp2=@fopen($filename,'a');  

        fwrite($fp2,$v);  

        fclose($fp2);  

        $i++;  

}

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
文件上传类
Oct 09 PHP
实现 win2003 下 mysql 数据库每天自动备份
Dec 06 PHP
对squid中refresh_pattern的一些理解和建议
Apr 17 PHP
php htmlspecialchars加强版
Feb 16 PHP
PHP 采集程序原理分析篇
Mar 05 PHP
Smarty模板学习笔记之Smarty简介
May 20 PHP
PHP中使用json数据格式定义字面量对象的方法
Aug 20 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
Dec 18 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
laravel实现按月或天或小时统计mysql数据的方法
Oct 09 PHP
php提取字符串中网站url地址的方法
Dec 03 #PHP
thinkphp常见路径用法分析
Dec 02 #PHP
ThinkPHP中关联查询实例
Dec 02 #PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 #PHP
ThinkPHP实现ajax仿官网搜索功能实例
Dec 02 #PHP
php递归json类实例
Dec 02 #PHP
php实现的SESSION类
Dec 02 #PHP
You might like
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
2013/06/21 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
js获取图片长和宽度的代码
2009/11/24 Javascript
基于JQuery的密码强度验证代码
2010/03/01 Javascript
jquery下实现overlay遮罩层代码
2010/08/25 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
2020/09/24 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
Python的Twisted框架中使用Deferred对象来管理回调函数
2016/05/25 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
python中学习K-Means和图片压缩
2017/11/20 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
params有什么用
2016/03/01 面试题
北大自主招生自荐信
2013/10/19 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
海底两万里读书笔记
2015/06/26 职场文书
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
2021/06/07 Python
nginx内存池源码解析
2021/11/20 Servers
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js