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秒就出結果
當然其他異步形式也可以實現,但是進程可以考慮搭配腳本來使用,比如腳步爬蟲之類的操作