process
最后更新于:2022-04-02 02:20:45
[TOC]
## demo
创建一个子进程
```
$procoess = new swoole_process(function (swoole_process $pro){
echo "not output to term";
//开启http_server.php 的进程
$pro->exec('/usr/local/bin/php', [__DIR__."/../server/http_server.php"]);
},true);//如果第二个参数为 true 输出不会输出到屏幕中
$pid = $procoess->start();
//子进程
echo $pid . PHP_EOL;
//回收结束运行的子进程。 如上面代码的 http_server.php
swoole_process::wait();
```
查看父进程 id
`ps | grep process.php`
process.php 为代码所在的文件名
通过父进程 id 查看 进程树,需要` brew install pstree`
`pstree -p 26387`
## 使用场景
获取多个 url 中的内容
```
echo "process-start-time ". date('Y-m-d H:i:s',time()).PHP_EOL;
//传统获取 url 中的内容
$url =[
'http://baidu.com',
'http://sina.com.cn',
'http://qq com',
'http://baidu.com?search=singa',
'http://baidu.com?search=singwa2',
'http://baidu.com?search=imooc',
];
/*
foreach ($url as $v){
$content []=curlData($v);
}
*/
for ($i=0; $i <6 ; $i++) {
//子进程
$process = new swoole_process(function (swoole_process $worker) use($i,$url){
$content = curlData($url[$i]);
//方法1 输出到管道中
echo $content.PHP_EOL;
//方法2 输出到管道中
$worker->write($content);
},true);
$pid = $process->start();
$works[$pid] = $process;
}
//获取管道中的内容
foreach ($works as $process){
echo $process->read();
}
function curlData($url){
sleep(1);//假设耗时一秒
return $url.'success'.PHP_EOL;
}
echo "process-end-time ". date('Y-m-d H:i:s',time()).PHP_EOL;
//总耗时只有 1秒 而非 6s
```
';