PHP 自帶的 pcntl,存在很多不足,如: 沒有提供進程間通信的功能; 不支持重定向標準輸入和輸出; 只提供了 fork 這樣原始的介面,容易使用錯誤; Swoole\Process 提供瞭如下特性: 可以方便的實現進程間通訊; 支持重定向標準輸入和輸出,在子進程內 echo 不會列印屏幕,而是 ...
PHP
自帶的 pcntl
,存在很多不足,如:
- 沒有提供進程間通信的功能;
- 不支持重定向標準輸入和輸出;
- 只提供了
fork
這樣原始的介面,容易使用錯誤;
Swoole\Process
提供瞭如下特性:
- 可以方便的實現進程間通訊;
- 支持重定向標準輸入和輸出,在子進程內
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;