• 欢迎访问小杰博客网站
  • 欢迎访问小杰博客网站哦

PHP多线程pthreads使用例子

程序 小杰 6年前 (2017-12-27) 1745次浏览 已收录 0个评论

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

  1. <?php
  2. declare(ticks = 1);
  3. $running = 1;
  4. //信号处理函数
  5. function sig_handler($signo)
  6. {
  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.   public function __construct($url) {
  20.     $this->url = $url;
  21.   }
  22.   public function run() {
  23.     if ($this->url) {
  24.       $this->result = model_http_curl_get($this->url);
  25.     }
  26.   }
  27. }
  28. function model_http_curl_get($url) {
  29.   $curl = curl_init();
  30.   curl_setopt($curl, CURLOPT_URL, $url);
  31.   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  32.   curl_setopt($curl, CURLOPT_TIMEOUT, 5);
  33.   curl_setopt($curl, CURLOPT_USERAGENT, ‘Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)’);
  34.   $result = curl_exec($curl);
  35.   curl_close($curl);
  36.   return $result;
  37. }
  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. }
  49. while ($urls && $running) {
  50.   foreach ($pool as $key=>$worker) {
  51.     if(! $worker->isRunning()){
  52.       //unset($pool[$key]);
  53.       echo “线程”.$key.“已结束\n”;
  54.       $url = array_shift($urls);
  55.       $pool[$key] = new test($url);
  56.       $pool[$key]->start();
  57.       echo “启动线程$key\n”;
  58.     }
  59.   }
  60.   usleep(1000);
  61. }//phpfensi.com
  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. }
  73. ?>

小杰博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP多线程pthreads使用例子
喜欢 (1)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址