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 正则表达式小结
Aug 31 PHP
PHP JSON格式数据交互实例代码详解
Jan 13 PHP
easyui的tabs update正确用法分享
Mar 21 PHP
PHP分页类集锦
Nov 18 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
php文件缓存类用法实例分析
Apr 22 PHP
PHP中使用curl伪造IP的简单方法
Aug 07 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
php 可变函数使用小结
Jun 12 PHP
php 防护xss,PHP的防御XSS注入的终极解决方案
Apr 01 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
php操作MongoDB类实例
2015/06/17 PHP
php判断访问IP的方法
2015/06/19 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
JavaScript中的闭包
2016/02/24 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
微信小程序实现授权登录
2019/05/15 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Python递归函数实例讲解
2019/02/27 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
django-allauth入门学习和使用详解
2019/07/03 Python
python  logging日志打印过程解析
2019/10/22 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
学生个人求职自荐信格式
2013/09/23 职场文书
绩效工资分配方案
2014/01/18 职场文书
小区文明倡议书
2014/05/16 职场文书
设计师求职信
2014/07/01 职场文书
导航工程专业自荐信
2014/09/02 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
运动会报道稿大全
2015/07/23 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
python 统计代码耗时的几种方法分享
2021/04/02 Python