swoole_process::__construct

创建子进程

swoole_process::__construct(callable $function, $redirect_stdin_stdout = false, $pipe_type = 2);

管道类型

swoole_process ( 或 Swoole\Process) 对象在销毁时会自动关闭管道,子进程内如果监听了管道会收到CLOSE事件
使用swoole_process作为监控父进程,创建管理子process时,父类必须注册信号SIGCHLD对退出的进程执行wait,否则子process一旦被kill会引起父process exit

在子进程中创建 Server

例 1:

可以在 swoole_process 创建的子进程中使用 swoole_server,但为了安全必须在$process->start 创建进程后,调用 $worker->exec() 执行。代码如下:

<?php
$process = new swoole_process('callback_function', true);

$pid = $process->start();

function callback_function(swoole_process $worker)
{
    $worker->exec('/usr/local/bin/php', array(__DIR__.'/swoole_server.php'));
}

swoole_process::wait();

例 2:使用匿名函数作为进程逻辑,并实现了一个简单的父子进程通讯

<?php
$process = new swoole_process(function (swoole_process $process) {
	$process->write('Hello');
}, true);

$process->start();
usleep(100);

echo $process->read(); // 输出 Hello

IO 线程池问题

由于Swoole的异步文件IO使用了线程池,在使用了这些API之后再创建Process可能会出现非常复杂的带线程fork问题。因此请勿在使用异步文件IO函数后创建Process

2.1.4/1.10.4或更高版本已经禁止了这种行为,底层检测到已创建线程池再执行new Process会抛出致命错误