使用pthreads PHP扩展多线程

浏览:2143 发布日期:2018/05/23 分类:用法示例 关键字: pthreads
PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间。
例子一:
下面这段代码 是在控制器里,调用线程 需要写一个公共线程的类,类放在libray/think文件下面/**
     * 线程池 - 推送
     * 2018.5.18
     * @param $sendids
     */    
    function pushlist($sendids){
                
        foreach ( $sendids as $v ){
            $thread[] = new \Think\MultiThread($v);
        }
        foreach($thread as $request) {
            // 运行线程:start()方法会触发run()运行
            $request->start();
        }
    }
下面这段是公共的类文件<?php
namespace Think;

/**
 * 实现多线程必须继承Thread类
 * 2018.4.11
 */
class MultiThread  extends \Thread

    public $sendid = '';    
  
    public function __construct($sendid) {  
  
        $this->sendid  = $sendid;  
    }  
  
    public function run() { 
         
       $paidan_id = $this->sendid;  
       echo $paidan_id.'<br>';

    }

}

?>        
例子二:<?php
  class test_thread_run extends Thread 
  {
      public $url;
      public $data;

      public function __construct($url)
      {
          $this->url = $url;
      }

      public function run()
      {
          if(($url = $this->url))
          {
              $this->data = model_http_curl_get($url);
          }
      }
  }

  function model_thread_result_get($urls_array) 
  {
      foreach ($urls_array as $key => $value) 
      {
          $thread_array[$key] = new test_thread_run($value["url"]);
          $thread_array[$key]->start();
      }

      foreach ($thread_array as $thread_array_key => $thread_array_value) 
      {
          while($thread_array[$thread_array_key]->isRunning())
          {
              usleep(10);
          }
          if($thread_array[$thread_array_key]->join())
          {
              $variable_data[$thread_array_key] = $thread_array[$thread_array_key]->data;
          }
      }
      return $variable_data;
  }

  function model_http_curl_get($url,$userAgent="") 
  {
      $userAgent = $userAgent ? $userAgent : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)'; 
      $curl = curl_init();
      curl_setopt($curl, CURLOPT_URL, $url);
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($curl, CURLOPT_TIMEOUT, 5);
      curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
      $result = curl_exec($curl);
      curl_close($curl);
      return $result;
  }

  for ($i=0; $i < 100; $i++) 
  { 
      $urls_array[] = array("name" => "baidu", "url" => "http://www.baidu.com/s?wd=".mt_rand(10000,20000));
  }

  $t = microtime(true);
  $result = model_thread_result_get($urls_array);
  $e = microtime(true);
  echo "多线程:".($e-$t)."\n";

  $t = microtime(true);
  foreach ($urls_array as $key => $value) 
  {
      $result_new[$key] = model_http_curl_get($value["url"]);
  }
  $e = microtime(true);
  echo "For循环:".($e-$t)."\n";
?>
引用原文:https://www.cnblogs.com/kluan/p/5934228.html
最后一句: 技术无价,不喜勿喷。
评论( 相关
后面还有条评论,点击查看>>