发布于 1970-01-01 08:00
  • 3 个回答
    • http://pecl.php.net/package/pthreads
      下载tgz包,里面提供有众多examples示例代码,最简单的就是开启多个线程采集网络资源:

      <?php
      class Request extends Thread {
          public $url;
          public $data;
          public function __construct($url) {
              $this->url = $url;
          }
          public function run() {
              // 线程处理一个耗时5秒的任务
              for($i=0;$i<5;$i++) {
                  echo '线程: '.date('H:i:s')."\n";
                  sleep(1);
              }
              $response = file_get_contents($this->url);
              if ($response) {
                  $this->data = array($response);
              }
              echo "线程: 任务完成\n";
          }
      }
      $request = new Request('hello.html');
      // 运行线程:start()方法会触发run()运行
      if ($request->start()) {
          // 主进程处理一个耗时10秒的任务,此时线程已经工作
          for($i=0;$i<10;$i++) {
              echo '进程: '.date('H:i:s')."\n";
              sleep(1);
          }
          // 同步线程并输出线程返回的数据
          $request->join();
          echo '线程返回数据: '.$request->data[0];
      }
      /*
      如果顺序执行,合计时间将是15秒,借助线程,则只需10秒.
      生成文件: echo 'Hello' > hello.html
      运行计时: time php req.php 
      查看线程: ps -efL|head -n1 && ps -efL|grep php
      */
      

      值得注意的是,不要在线程里使用echo输出内容,否则会出现不可预知的错误和行为,比如乱码(garbled).尤其是在非CLI环境下,比如Apache/PHP-FPM.

      2022-12-01 20:27 回答
    • php就不要谈多线程了吧,哈哈

      2022-12-01 20:27 回答
    • 我也想知道.........................

      2022-12-01 20:27 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有