继上篇 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秒
如果觉得本文对你有所帮助,点个赞,或者赏杯咖啡钱,你的认可对我很重要