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核心代码分析require和include的区别
Jan 02 PHP
php在程序中将网页生成word文档并提供下载的代码
Oct 09 PHP
php笔记之:初探PHPcms模块开发介绍
Apr 26 PHP
LotusPhp笔记之:Cookie组件的使用详解
May 06 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
Apr 18 PHP
Yii使用CLinkPager分页实例详解
Jul 23 PHP
php生成图片缩略图的方法
Apr 07 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
PHP中关键字interface和implements详解
Jun 14 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
Jul 03 PHP
Laravel5.5以下版本中如何自定义日志行为详解
Aug 01 PHP
PHP html_entity_decode()函数讲解
Feb 25 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 !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
2011/01/07 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
2014/03/03 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
python 将字符串转换成字典dict
2013/03/24 Python
python爬虫常用的模块分析
2014/08/29 Python
在服务器端实现无间断部署Python应用的教程
2015/04/16 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
详解Python的循环结构知识点
2019/05/20 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
联想中国官方商城:Lenovo China
2017/10/18 全球购物
复古服装:RetroStage
2019/05/10 全球购物
澳大利亚家具商店:Freedom
2020/12/17 全球购物
小学科学教学反思
2014/01/26 职场文书
致裁判员加油稿
2014/02/08 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
简易离婚协议书范本
2014/10/24 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
高中社区服务活动报告
2015/02/05 职场文书
联谊活动总结范文
2015/05/09 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
mysql创建存储过程及函数详解
2021/12/04 MySQL