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 相关文章推荐
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
May 08 PHP
php连接Access数据库错误及解决方法
Jun 20 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
PHP中ob_start函数的使用说明
Nov 11 PHP
php中运用http调用的GET和POST方法示例
Sep 29 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
Apr 30 PHP
PHP中类的继承和用法实例分析
May 24 PHP
PHP实现的猴王算法(猴子选大王)示例
Apr 30 PHP
PHP集成环境XAMPP的安装与配置
Nov 13 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
Jan 17 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
Sep 09 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 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
php你的验证码安全码?
2007/01/02 PHP
PHP添加MySQL数据记录代码
2008/06/07 PHP
关于js和php对url编码的处理方法
2014/03/04 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
stripos函数知识点实例分享
2019/02/11 PHP
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
小程序开发之模态框组件封装
2020/04/23 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
基于Python 函数和方法的区别说明
2021/03/24 Python
大二学期个人自我评价
2014/01/13 职场文书
收银员岗位职责
2014/02/07 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
中学教师个人总结
2015/02/10 职场文书
公司出纳岗位职责
2015/03/31 职场文书
纯html+css实现奥运五环的示例代码
2021/08/02 HTML / CSS