当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP多线程pthreads使用例子

发布:smiling 来源: PHP粉丝网  添加日期:2015-12-24 13:37:40 浏览: 评论:0 

php本身对于多线程处理是不够理想的,但如果我们使用pthreads性能会有所提高了,下面来看一个PHP多线程pthreads使用例子.

  1. <?php 
  2. declare(ticks = 1); 
  3. $running = 1; 
  4.  
  5. //信号处理函数 
  6. function sig_handler($signo
  7.   switch ($signo) { 
  8.   case SIGINT: 
  9.     finish(); 
  10.     break
  11.   default
  12.     break
  13.   } 
  14.  
  15. pcntl_signal(SIGINT, "sig_handler"); 
  16. class test extends \Thread { 
  17.   public $url
  18.   public $result
  19.  
  20.   public function __construct($url) { 
  21.     $this->url = $url
  22.   } 
  23.  
  24.   public function run() { 
  25.     if ($this->url) { 
  26.       $this->result = model_http_curl_get($this->url); 
  27.     } 
  28.   } 
  29. function model_http_curl_get($url) { 
  30.   $curl = curl_init();   
  31.   curl_setopt($curl, CURLOPT_URL, $url);   
  32.   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);   
  33.   curl_setopt($curl, CURLOPT_TIMEOUT, 5);   
  34.   curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)');   
  35.   $result = curl_exec($curl);   
  36.   curl_close($curl);   
  37.   return $result;   
  38. for ($i = 0; $i < 500; $i++) { 
  39.   $urls[] = 'http://www.baidu.com/s?wd='. rand(10000, 20000); 
  40.  
  41. $pool = array(); 
  42. for ($i=1;$i<=5;$i++) { 
  43.   $key = uniqid(); 
  44.   $url = array_shift($urls); 
  45.   $pool[$key] = new test($url); 
  46.   $pool[$key]->start(); 
  47.   echo "启动线程$key\n"
  48. while ($urls && $running) { 
  49.   foreach ($pool as $key=>$worker) { 
  50.     if(! $worker->isRunning()){ 
  51.       //unset($pool[$key]); 
  52.       echo "线程".$key."已结束\n"
  53.       $url = array_shift($urls); 
  54.       $pool[$key] = new test($url); 
  55.       $pool[$key]->start(); 
  56.       echo "启动线程$key\n"
  57.     } 
  58.   } 
  59.   usleep(1000); 
  60. }//phpfensi.com 
  61.  
  62. function finish() { 
  63.   global $running
  64.   global $pool
  65.   $running = 0; 
  66.   echo "接收到信号,等待运行中线程结束\n"
  67.   foreach ($pool as $key=>$worker) { 
  68.     if ($pool[$key]->join()) { 
  69.       var_dump($pool[$key]->result); 
  70.     } 
  71.   } 
  72. ?>

Tags: PHP多线程 pthreads例子

分享到: