Swoole 进程Process 持续更新
需要注意Process进程在系统是非常昂贵的资源,创建进程消耗很大。另外创建的进程过多会导致进程切换开销大幅上升
Swoole\Process特性:
- 基于Unix Socket和sysvmsg消息队列的进程间通信,只需调用write/read或者push/pop即可
- 支持重定向标准输入和输出,在子进程内echo不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据
- 配合Event模块,创建的PHP子进程可以异步的事件驱动模式
- 提供了exec接口,创建的进程可以执行其他程序,与原PHP父进程之间可以方便的通信
简单实现
process.php
<?php
/**
* Created by PhpStorm.
* User: dom
* Date: 19-2-22
* Time: 下午5:34
*/
$redirectStdinStdout = false; // true:进程输出不会显示在终端,会直接进入管道 false:则会进入显示终端
$process = new swoole_process(function (swoole_process $pro){
// 逻辑代码
echo '123123';
$pro->exec('/usr/local/bin/php', ['/var/www/project/yii-best-practice/cli/yii',
't/index', '-m=123', 'abc', 'xyz']); // exec 系统调用
},$redirectStdinStdout);
$pid = $process->start();
echo $pid.PHP_EOL;
swoole_process::wait(); // 回收结束运行的子进程。
拓展实现
<?php
/**
* Created by PhpStorm.
* User: dom
* Date: 19-2-23
* Time: 上午10:29
*/
echo '开始子进程' . date("Y-m-d H:i:s") . PHP_EOL;
$data = [
'https://baidu.com',
'https://qq.com',
'https://blog.csdn.net',
];
$workers = [];
foreach ($data as $key => $item) {
// 子进程
$process = new swoole_process(function (swoole_process $worker) use ($key, $item) {
// curl
$content = curlData($item);
$worker->write($content. PHP_EOL); // 写入管道
// echo $content . PHP_EOL;
}, true);
$pid = $process->start();
$workers[$pid] = $process;
}
foreach ($workers as $worker) {
echo $worker->read(); // 读取每个管道的内容
}
/**
* 逻辑方法
* @author: ZhuBN
* Date: 19-2-23 上午10:53
*
* @param $url
*
* @return string
*/
function curlData($url)
{
sleep(2);
return 'success:' . $url;
}
swoole_process::wait(); // 回收结束运行的子进程。
echo '结束子进程' . date("Y-m-d H:i:s") . PHP_EOL;
如果是php的形式的执行类似功能效果的话 需要用到的是 2*3秒,用上进程的话只需要2秒就出结果
当然其他异步形式也可以实现,但是进程可以考虑搭配脚本来使用,比如脚步爬虫之类的操作