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

Tags: PHP多线程 pthreads例子

分享到: