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安装全攻略:APACHE
Oct 09 PHP
PHP 变量定义和变量替换的方法
Jul 30 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
smarty内置函数capture用法分析
Jan 22 PHP
PHP实现搜索相似图片
Sep 22 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
php微信开发之音乐回复功能
Jun 14 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
Aug 21 PHP
PHP从尾到头打印链表实例讲解
Sep 27 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
PHP XML备份Mysql数据库
2009/05/27 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
开启PHP的伪静态模式
2015/12/31 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
javascript获取web应用根目录的方法
2014/02/12 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
js上下视差滚动简单实现代码
2017/03/07 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
python学习数据结构实例代码
2015/05/11 Python
python使用knn实现特征向量分类
2018/12/26 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
python实现超级马里奥
2020/03/18 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
python实现PolynomialFeatures多项式的方法
2021/01/06 Python
详解用 python-docx 创建浮动图片
2021/01/24 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
商务日语专业毕业生求职信
2013/10/26 职场文书
高二学生评语大全
2014/04/25 职场文书
营销与策划专业求职信
2014/06/20 职场文书
推普周活动总结
2014/08/28 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
人事专员岗位职责
2015/02/03 职场文书
高一作文之暖冬
2019/11/09 职场文书
golang连接MySQl使用sqlx库
2022/04/14 Golang