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 相关文章推荐
使用apache模块rewrite_module (转)
Feb 14 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
Look And Say 序列php实现代码
May 22 PHP
利用PHP生成静态HTML文档的原理
Oct 29 PHP
php中如何使对象可以像数组一样进行foreach循环
Aug 09 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
Jul 25 PHP
php操作xml入门之cdata区段
Jan 23 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
Jun 10 PHP
试用php中oci8扩展
Jun 18 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
May 20 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
Sep 26 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
WINXP下apache+php4+mysql
2006/11/25 PHP
php 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
javascript cookie解码函数(兼容ff)
2008/03/17 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
JS实现日期时间动态显示的方法
2015/12/07 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
JS基于Location实现访问Url、重定向及刷新页面的方法分析
2018/12/03 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
详解如何利用Cython为Python代码加速
2018/01/27 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
Python any()函数的使用方法
2019/10/28 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
Python项目打包成二进制的方法
2020/12/30 Python
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
铁路个人事迹材料
2014/01/30 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
试用期自我鉴定范文
2014/03/20 职场文书
大学生英语演讲稿
2014/04/24 职场文书
爱心活动计划书
2014/04/26 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书
优秀团员事迹材料
2014/12/25 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers
MongoDB数据库之添删改查
2022/04/26 MongoDB