2018年swoole实战7-进程详解

继上篇 2018年swoole实战6-异步redis

本篇演示 swoole进程管理模块

创建子进程

新建 process.php

start(); // 创建了一个子进程
echo $pid . PHP_EOL; // 子进程id

swoole_process::wait();
☁  process  php process.php
67540
swoole创建进程

调用外部程序

process.php

exec("/usr/local/opt/[email protected]/bin/php", [__DIR__.'/http_server.php']);
}, false); // 如果设置为true,终端就不会显示标准输出内容

$pid = $process->start(); // 创建了一个子进程
echo $pid . PHP_EOL; // 子进程id

swoole_process::wait();

http_server.php

on('request', function ($request, $response) {
    $response->header("Content-Type", "text/html; charset=utf-8");
    $time = date('Y-m-d H:i:s', time());
    $response->end("

{$time}--这是swoole提供的http服务,修改代码后要重启服务才能生效

"); }); $http->start();
☁  process  php process.php
68526
[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 工具可以查看相关进程的关系

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

多进程的实战案例

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

新建 process_curl.php

write($content . PHP_EOL);
    }, true);
    $pid = $process->start();
    $workers[$pid] = $process;
}

foreach ($workers as $process) {
    echo $process->read();
}

// 模拟获取数据, 耗时1秒
function getContent($url) {
    sleep(1);
    return $url . " 执行完成..." . PHP_EOL;
}
$runTime = time() - $startTime;
echo "程序执行时间为{$runTime}秒" . PHP_EOL;

执行结果:

☁  process  php process_curl.php
程序开始执行时间:17:13:54
http://www.zhihu.com 执行完成...

http://www.baidu.com 执行完成...

http://www.jianshu.com 执行完成...

http://www.huxiu.com 执行完成...

http://www.qq.com 执行完成...

程序执行时间为1秒

如果觉得本文对你有所帮助,点个赞,或者赏杯咖啡钱,你的认可对我很重要

你可能感兴趣的:(2018年swoole实战7-进程详解)