当前位置 知且行 php 正文 下一篇:

swoole实战7-进程详解

本篇演示 swoole进程管理模块

创建子进程

新建 process.php

  1. <?php
  2. $process = new swoole_process(function(swoole_process $pro) {
  3. echo 'swoole创建进程' . PHP_EOL;
  4. }, false); // 如果设置为true,终端就不会显示标准输出内容
  5. $pid = $process->start(); // 创建了一个子进程
  6. echo $pid . PHP_EOL; // 子进程id
  7. swoole_process::wait();
  1. process php process.php
  2. 67540
  3. swoole创建进程

调用外部程序

process.php

  1. <?php
  2. $process = new swoole_process(function(swoole_process $pro) {
  3. $pro->exec("/usr/local/opt/php@7.1/bin/php", [__DIR__.'/http_server.php']);
  4. }, false); // 如果设置为true,终端就不会显示标准输出内容
  5. $pid = $process->start(); // 创建了一个子进程
  6. echo $pid . PHP_EOL; // 子进程id
  7. swoole_process::wait();

http_server.php

  1. <?php
  2. $http = new swoole_http_server('0.0.0.0', 9502);
  3. $http->on('request', function ($request, $response) {
  4. $response->header("Content-Type", "text/html; charset=utf-8");
  5. $time = date('Y-m-d H:i:s', time());
  6. $response->end("<h1>{$time}--这是swoole提供的http服务,修改代码后要重启服务才能生效</h1>");
  7. });
  8. $http->start();
  1. process php process.php
  2. 68526
  3. [2018-07-27 16:38:53 @68526.0] TRACE Create swoole_server host=0.0.0.0, port=9502, mode=3, type=1

浏览器访问 http://127.0.0.1:9502/

查看进程树

通过 pstree 工具可以查看相关进程的关系

  1. brew install pstree # mac 安装 pstree
  2. ps aux | grep process.php # 获取进程id
  3. pstree -p 69932 # 显示进程树

多进程的实战案例

如果用php去抓取网页内容,传统的方式是用一个for循环,将url逐个遍历,假设每个url耗时1秒,6个url就需要耗时6s,这种方式效率太低了。通过swoole的进程管理模块,我们可以实现多进程抓取内容,每个进程对应负责一个url,从而实现1秒完成抓取任务

新建 process_curl.php

  1. <?php
  2. $startTime = time();
  3. echo "程序开始执行时间:" . date("H:i:s") . PHP_EOL;
  4. $workers = [];
  5. $urls = [
  6. 'http://www.zhihu.com',
  7. 'http://www.baidu.com',
  8. 'http://www.jianshu.com',
  9. 'http://www.huxiu.com',
  10. 'http://www.qq.com',
  11. ];
  12. for ($i = 0; $i < count($urls); $i++) {
  13. // 每次开启一个子进程
  14. $process = new swoole_process(function (swoole_process $worker) use($i, $urls) {
  15. $content = getContent($urls[$i]);
  16. $worker->write($content . PHP_EOL);
  17. }, true);
  18. $pid = $process->start();
  19. $workers[$pid] = $process;
  20. }
  21. foreach ($workers as $process) {
  22. echo $process->read();
  23. }
  24. // 模拟获取数据, 耗时1秒
  25. function getContent($url) {
  26. sleep(1);
  27. return $url . " 执行完成..." . PHP_EOL;
  28. }
  29. $runTime = time() - $startTime;
  30. echo "程序执行时间为{$runTime}秒" . PHP_EOL;

执行结果:

  1. process php process_curl.php
  2. 程序开始执行时间:17:13:54
  3. http://www.zhihu.com 执行完成...
  4. http://www.baidu.com 执行完成...
  5. http://www.jianshu.com 执行完成...
  6. http://www.huxiu.com 执行完成...
  7. http://www.qq.com 执行完成...
  8. 程序执行时间为1
转载必须注明出处:https://www.zhiqiexing.com/52.html

关于我

我希望能成为一个认真、有趣、创造更多价值的人
关注微信
微信扫一扫关注我

微信扫一扫关注我

返回顶部