加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 教程 > 正文

PHP多线程类及用法实例

发布时间:2022-06-22 08:51:02 所属栏目:教程 来源:互联网
导读:这篇文章主要介绍了PHP多线程类及用法,实例分析了多线程类的具体实现方法及应用技巧,并结合下载远程图片的实例予以深入分析,需要的朋友可以参考下 本文实例讲述了PHP多线程类及用法。分享给大家供大家参考。具体分析如下: 一般来说可通过WEB服务器来实现PHP
  这篇文章主要介绍了PHP多线程类及用法,实例分析了多线程类的具体实现方法及应用技巧,并结合下载远程图片的实例予以深入分析,需要的朋友可以参考下
 
  本文实例讲述了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]);//释放资源    

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读