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中++i 与 i++ 的区别
Aug 08 PHP
php通过strpos查找字符串出现位置的方法
Mar 17 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
May 12 PHP
用php代码限制国内IP访问我们网站
Sep 26 PHP
weiphp微信公众平台授权设置
Jan 04 PHP
PHP中addcslashes与stripcslashes函数用法分析
Jan 07 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
Oct 08 PHP
php 获取文件行数的方法总结
Oct 11 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
Dec 19 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 PHP
php session_decode函数用法讲解
May 26 PHP
PHP安全之register_globals的on和off的区别
Jul 23 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 短链接算法收集与分析
2011/12/30 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
PHP 导出Excel示例分享
2014/08/18 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
浅析JavaScript中的隐式类型转换
2013/12/05 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
python实现Adapter模式实例代码
2018/02/09 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
Javascript 高级手势使用介绍
2013/04/21 HTML / CSS
微博营销计划书
2014/01/10 职场文书
物业保安员岗位职责制度
2014/01/30 职场文书
材料会计岗位职责
2014/03/06 职场文书
大学校务公开实施方案
2014/03/31 职场文书
教师对学生的评语
2014/04/28 职场文书
悬空寺导游词
2015/02/05 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
学生会任命书范本
2015/09/21 职场文书
Win11筛选键导致键盘失灵怎么解决? Win11关闭筛选键的技巧
2022/04/08 数码科技