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 chmod 函数与批量修改文件目录权限
May 10 PHP
php url地址栏传中文乱码解决方法集合
Jun 25 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
php顺序查找和二分查找示例
Mar 27 PHP
帝国cms目录结构分享
Jul 06 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 19 PHP
YII Framework框架教程之缓存用法详解
Mar 14 PHP
CI框架表单验证实例详解
Nov 21 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 PHP
Laravel5.1 框架控制器基础用法实例分析
Jan 04 PHP
数据结构之利用PHP实现二分搜索树
Oct 25 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
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
PHP统计目录大小的自定义函数分享
2014/11/18 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
vue-cli如何添加less 以及sass
2017/07/06 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
node使用Mongoose类库实现简单的增删改查
2018/11/08 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
Python生成随机数的方法
2014/01/14 Python
Python Selenium参数配置方法解析
2020/01/19 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
Python 如何查找特定类型文件
2020/08/17 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
银行出纳岗位职责
2013/11/25 职场文书
年度考核自我评价
2014/01/25 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
安全生产承诺书范文
2014/05/22 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android