Swoole Process多进程通信的实现
本篇学习将基于 Swoole Process
模块实现进程间的通信。先来看看通过 PHP多进程间的通信 或许更容易理解些。
管道通信
文件:d7.php
<?php
use Swoole\Process;
use function Swoole\Coroutine\run;
/**
* new Process(); 创建子进程
* @param callbale $function 子进程创建后执行的函数
* @param bool $redirect_stdin_stdout 重定向子进程的标准输入和输出
* @param int $pipe_type 创建管道
* @param bool $enable_coroutine 是否启用协程
**/
$process = new Process(function(Process $proc){
// 将管道到出为 Coroutine\Socket 对象后,
// 用Coroutine\socket 对象的方法进程间通讯
$socket = $proc->exportSocket();
// 接收数据
echo $socket->recv();
// 发送数据
$socket->send("Son:hi,主进程,我是子进程,已收到消息,我今天保证把碗洗的干干净净\n");
// sleep(3);
echo "我是子进程,我的使命结束了\n";
}, false, 1, true);
// 启动子进程
$process->start();
// 父进程使用协程
run(function() use ($process) {
$socket = $process->exportSocket();
$socket->send("Father:hello 子进程,我是父进程,今天你必须把碗洗了\n");
echo $socket->recv();
});
// 回收结束运行的子进程
Process::wait(true);
运行文件并查看结果
php d7.php
// 结果
hello 子进程,我是父进程,今天你必须把碗洗了
我是子进程,我的使命结束了
hi,主进程,我是子进程,已收到消息,我今天保证把碗洗的干干净净
对于输出结果有没有感到一丝疑问?
我是子进程,我的使命结束了
在子进程中先自行了,如果有此疑问,不妨打开sleep
的注释再来看看结果。
异步通信
文件:d8.php
<?php
use Swoole\Process;
use function Swoole\Coroutine\run;
$process = new Process(function (Process $worker){
// 创建socket事件监听
Swoole\Event::add($worker->pipe, function($pipe) use ($worker){
// 通过管道从主进程中读取数据
$cmd = $worker->read();
ob_start();
// 执行外部程序并且显示原始输出
passthru($cmd);
$res = ob_get_clean() ? : ' ';
$res = trim($res) . '. worker pid:' . $worker->pid . "\n";
// 将数据写入管道
$worker->write($res);
// 退出子进程
$worker->exit(0);
});
}, false, 1, true);
// 启动进程
$process->start();
// 主进程将数据通过管道发送给子子进程
$process->write('php --version');
// 从子进程中读取数据
$msg = $process->read();
echo 'result from worker :' . $msg;
执行并查看结果
php d8.php
// 结果
result from worker :PHP 8.0.1 (cli) (built: Mar 31 2021 23:05:27) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.1, Copyright (c) Zend Technologies. worker pid:1665
如有错误,欢迎指正,一起交流学习。
2021-04-20
请登录后再评论