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 相关文章推荐
用PHP实现小型站点广告管理
Oct 09 PHP
php在线生成ico文件的代码
Oct 09 PHP
PHP 程序员的调试技术小结
Nov 15 PHP
队列在编程中的实际应用(php)
Sep 04 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
Feb 28 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
PHP数学运算函数大汇总(经典值得收藏)
Apr 01 PHP
最新最全PHP生成制作验证码代码详解(推荐)
Jun 12 PHP
php中namespace及use用法分析
Dec 06 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
PHP递归实现快速排序的方法示例
Dec 18 PHP
Yii框架核心组件类实例详解
Aug 06 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
解析coreseek for sphinx的使用
2013/06/21 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
php伪静态之APACHE篇
2014/06/02 PHP
php去除html标记的原生函数详解
2015/01/27 PHP
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
js实现百度淘宝搜索功能
2020/02/17 Javascript
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
python微信好友数据分析详解
2018/11/19 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
主题实践活动总结
2014/05/08 职场文书
个人收入证明模板
2014/09/18 职场文书
师德师风个人自我剖析材料
2014/09/27 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
太空授课观后感
2015/06/17 职场文书