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;
相关文章
相关标签/搜索