Swoole 進程Process 持續更新

Swoole 進程Process 持續更新

需要注意Process進程在系統是非常昂貴的資源,創建進程消耗很大。另外創建的進程過多會導致進程切換開銷大幅上升

Swoole\Process特性:

  1. 基於Unix Socket和sysvmsg消息隊列的進程間通信,只需調用write/read或者push/pop即可
  2. 支持重定向標準輸入和輸出,在子進程內echo不會打印屏幕,而是寫入管道,讀鍵盤輸入可以重定向爲管道讀取數據
  3. 配合Event模塊,創建的PHP子進程可以異步的事件驅動模式
  4. 提供了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秒就出結果
當然其他異步形式也可以實現,但是進程可以考慮搭配腳本來使用,比如腳步爬蟲之類的操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章