Swoole 进程管理模块 Process 之单进程的使用
PHP
自带的 pcntl
,存在很多不足,如:
- 没有提供进程间通信的功能;
- 不支持重定向标准输入和输出;
- 只提供了
fork
这样原始的接口,容易使用错误;
SwooleProcess
提供了如下特性:
- 可以方便的实现进程间通讯;
- 支持重定向标准输入和输出,在子进程内
echo
不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据; - 提供了
SwooleProcess->exec()
接口,创建的进程可以执行其他程序,与原PHP
父进程之间可以方便的通信; - 在协程环境中无法使用
SwooleProcess
模块,可以使用runtime hook
+proc_open
实现,参考协程进程管理;
使用示例:
use SwooleProcess;
// 主进程创建 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;