PHP-Swoole进程管理Process的使用介绍

1.前言

根据官方文档介绍,swoole在1.7.2版本增加了进程管理模块来替代pcntl,它的优势如下:

1.可以将标准输入输出流重定向到管道

2.父进程与子进程们可以通过管道,消息队列等形式通信

3.可以通过exec接口在创建进程的时候调用其他进程

2.最基本的多进程示例

for ($i = 0; $i < 3; $i++) {
    $process = new swoole_process(function ($worker) {
        echo 'child' . posix_getpid() . PHP_EOL;
    }, false);

    echo 'pid:' . $process->start() . PHP_EOL;
}

while (swoole_process::wait(true)) ;

echo 'exit by main process' . PHP_EOL;

swoole_process用于创建子进程,通过第一个参数绑定子进程的回掉函数,当子进程回调函数执行完毕会自动退出子进程。

3.子进程与父进程通过管道通信

$childs = [];

for ($i = 0; $i < 3; $i++) {
    $process = new swoole_process(function ($worker) {
        echo 'child' . posix_getpid() . PHP_EOL;
        echo 'From Master:' . $worker->read() . PHP_EOL;
        $worker->write('hello master!');
    }, false);

    $childs[$process->start()] = $process;
}

foreach($childs as $pid => $worker) {
    $worker->write("hello worker{$pid}");
    echo "From Worker:" . $worker->read() . PHP_EOL;
}

echo 'exit by main process' . PHP_EOL;

管道的读操作是阻塞的,所以当父进程读取完子进程的数据,子进程就退出了。因此不需要调用wait方法等待子进程退出。

4.子进程与父进程通过事件机制异步通信

$childs = [];

for ($i = 0; $i < 3; $i++) {
    $process = new swoole_process(function ($worker) {
        swoole_event_add($worker->pipe, function($pipe) use ($worker) {
            echo 'child' . posix_getpid() . PHP_EOL;
            echo 'From Master: ' . $worker->read() . PHP_EOL;
            $worker->write('hello master!');
            $worker->exit(0);
        });
    }, false);

    $childs[$process->start()] = $process;
}

foreach($childs as $pid => $worker) {
    swoole_event_add($worker->pipe, function() use ($worker) {
        echo "From Worker: " . $worker->read() . PHP_EOL;
    });
    $worker->write("hello worker{$pid}");
}

swoole_process::signal(SIGCHLD, function() use (&$childs) {
    while($ret = swoole_process::wait(true)) {
        echo "Worker Pid:{$ret['pid']} Exit" . PHP_EOL;
        unset($childs[$ret['pid']]);
        if (count($childs) < 1) {
            exit(0);
        }
    }
});

由于事件机制有一个事件循环阻塞监听事件的触发,所以父子进程不会自动退出,需要手动维护进程的退出时机。父进程需要注册SIGCHLD信号来捕获子进程的退出。

如无特殊说明,文章均为本站原创,转载请注明出处。如发现有什么不对的地方,希望得到您的指点。

发表评论

电子邮件地址不会被公开。 必填项已用*标注