找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1083|回复: 0
打印 上一主题 下一主题

PHP多线程类及用法实例

[复制链接]

3444

主题

3465

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11142
跳转到指定楼层
楼主
发表于 2018-2-14 05:51:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            本文实例讲述了PHP多线程类及用法。分享给大家供大家参考。具体分析如下:
一般来说可通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程.
但不管怎么样,它还是能满足我们的一些需要的,在需要类似多线程的功能方面还是可以采用这个类,代码如下:
[U]复制代码[/U] 代码如下:/**
* @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
使用方法,代码如下:
[U]复制代码[/U] 代码如下thread = new thread();
$thread->addthread('func1','info1');
$thread->addthread('func2','info2');
$thread->addthread('func3','info3');
$thread->runthread();
说明:
addthread() 是添加线程函数,第一个参数是函数名,之后的参数(可选)为传递给指定函数的参数.
runthread() 是执行线程的函数.
PHP实例:利用curl实现多线程下载图片
其实是php利用curl实现的一个多线程类,有了这个类,我们也可利用该类执行多线程任务了,代码如下:
[U]复制代码[/U] 代码如下: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使用多线程下载类示例,下载远程图片,代码如下:
[U]复制代码[/U] 代码如下curl_mul=new curl_multi();  
$curl_mul->setUrlList(array('http://www.jb51.net/','http://www.jb51.net/','http://www.jb51.net/'));  
$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异步多线程swoole用法实例
  • PHP多线程编程之管道通信实例分析
  • 如何解决PHP无法实现多线程的问题
  • php多线程实现方法及用法实例详解
  • php三种实现多线程类似的方法
  • PHP使用Pthread实现的多线程操作实例
  • PHP安装threads多线程扩展基础教程
  • PHP7多线程搭建教程
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端