Swoole 進程管理模塊 Process 之單進程的使用

PHP 自帶的 pcntl,存在不少不足,如:swoole

  • 沒有提供進程間通訊的功能;
  • 不支持重定向標準輸入和輸出;
  • 只提供了 fork 這樣原始的接口,容易使用錯誤;

Swoole\Process 提供了以下特性:code

  • 能夠方便的實現進程間通信;
  • 支持重定向標準輸入和輸出,在子進程內 echo 不會打印屏幕,而是寫入管道,讀鍵盤輸入能夠重定向爲管道讀取數據;
  • 提供了 Swoole\Process->exec() 接口,建立的進程能夠執行其餘程序,與原 PHP 父進程之間能夠方便的通訊;
  • 在協程環境中沒法使用 Swoole\Process 模塊,能夠使用 runtime hook+proc_open 實現,參考協程進程管理;

使用示例:協程

use Swoole\Process;

// 主進程建立 3 個子進程
for ($n = 1; $n <= 3; $n++) {
    $process = new Process(function () use ($n) {
        echo 'Child #' . getmypid() . " start and sleep {$n}s" . PHP_EOL;
        sleep($n);
        echo 'Child #' . getmypid() . ' exit' . PHP_EOL;
    });
    $process->start();
}

// 主進程用 wait 回收子進程
for ($n = 3; $n--;) {
    $status = Process::wait(true);
    echo "Recycled #{$status['pid']}, code={$status['code']}, signal={$status['signal']}" . PHP_EOL;
}

echo 'Parent #' . getmypid() . ' exit' . PHP_EOL;
相關文章
相關標籤/搜索