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 错误之引号中使用变量
May 04 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
php5.5新数组函数array_column使用
Jul 08 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
Feb 03 PHP
PHP实现的购物车类实例
Jun 17 PHP
php析构函数的简单使用说明
Aug 24 PHP
PHP环境中Memcache的安装和使用
Nov 05 PHP
php提交过来的数据生成为txt文件
Apr 28 PHP
PHP 输出缓冲控制(Output Control)详解
Aug 25 PHP
PHP重定向与伪静态区别
Feb 19 PHP
PHP实现图片压缩
Sep 09 PHP
php双向队列实例讲解
Nov 17 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去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
深入解析php中的foreach函数
2013/08/31 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
display和visibility的区别示例介绍
2014/02/26 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
微信小程序实现bindtap等事件传参
2019/04/08 Javascript
nodejs 递归拷贝、读取目录下所有文件和目录
2019/07/18 NodeJs
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
python实现简单多人聊天室
2018/12/11 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
2019/06/11 Python
python中字典增加和删除使用方法
2020/09/30 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
C语言面试题
2015/10/30 面试题
环境工程专业个人求职信
2013/12/05 职场文书
同学聚会主持词
2014/03/18 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python