继上篇 2018年swoole实战6-异步redis
本篇演示 swoole进程管理模块
新建 process.php
<?php
$process = new swoole_process(function(swoole_process $pro) {
echo 'swoole创建进程' . PHP_EOL;
}, false); // 如果设置为true,终端就不会显示标准输出内容
$pid = $process->start(); // 创建了一个子进程
echo $pid . PHP_EOL; // 子进程id
swoole_process::wait();
☁ process php process.php
67540
swoole创建进程
process.php
<?php
$process = new swoole_process(function(swoole_process $pro) {
$pro->exec("/usr/local/opt/php@7.1/bin/php", [__DIR__.'/http_server.php']);
}, false); // 如果设置为true,终端就不会显示标准输出内容
$pid = $process->start(); // 创建了一个子进程
echo $pid . PHP_EOL; // 子进程id
swoole_process::wait();
http_server.php
<?php
$http = new swoole_http_server('0.0.0.0', 9502);
$http->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("<h1>{$time}--这是swoole提供的http服务,修改代码后要重启服务才能生效</h1>");
});
$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
<?php
$startTime = time();
echo "程序开始执行时间:" . date("H:i:s") . PHP_EOL;
$workers = [];
$urls = [
'http://www.zhihu.com',
'http://www.baidu.com',
'http://www.jianshu.com',
'http://www.huxiu.com',
'http://www.qq.com',
];
for ($i = 0; $i < count($urls); $i++) {
// 每次开启一个子进程
$process = new swoole_process(function (swoole_process $worker) use($i, $urls) {
$content = getContent($urls[$i]);
$worker->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秒