Swoole Process多进程通信的实现

作者: 温新

分类: 【高性能PHP】

阅读: 2514

时间: 2021-04-20 15:34:32

本篇学习将基于 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

请登录后再评论