本篇文章给大家带来的内容是关于swoole_process父子进程管道通信的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
话不多说直接上代码
创建的子进程:
public function __construct()
{
$this->redis = Container::get(SwooleRedis::class);//获取异步redis获取更高性能
$this->process = new swoole_process(function (swoole_process $process) {
return $this->process($process);
}, false, SOCK_DGRAM);
$this->process->name('Test_Gateway');
$this->process->useQueue();
$this->process->start();//启动子进程
}
/**
* 子进程处理逻辑
* @param swoole_process $process
*/
private function process(swoole_process $process)
{
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); //异步非阻塞
$client->on("connect", function (swoole_client $cli) use ($process) {
$process->write('connected');
});
$client->on("receive", function (swoole_client $cli, $data) use ($process) {
$process->write($data);
});
$client->on("error", function (swoole_client $cli) use ($process) {
$process->write('error');
});
$client->on("close", function (swoole_client $cli) use ($process) {
$process->write('close');
});
if ($client->connect('127.0.0.1', 90, -1)) {
} else {
$process->write('网关连接失败');
}
swoole_event_add($process->pipe,
function ($pipe) use ($process, $client) {//读取父进程管道消息
$client->send($process->read());
});
}父进程onWorkerStart:
/**
* @param swoole_server $serv
* @param $worker_id
*/
public function onWorkerStart(\swoole_server $serv, $worker_id)
{
if ($worker_id === 0) {
swoole_timer_tick(1000, function () {
$this->process->write('ping');
});
$process = $this->process;
swoole_event_add($process->pipe,
function ($pipe) use ($process) {//获取子进程的管道消息
echo "子进程消息:" . $process->read() . PHP_EOL;
});
}
}- 子进程的client客户端可以忽略不计,本demo只是掩饰管道通信的例子
- 使用管道就不可以使用消息队列:$process_push()和$process->pop();
- 理论上在父子进程各注册一个event_loop即可实现一边发消息一边接收
- 其他的后续补充
超级适合代理建设企业站点的企业源码,超方面实用!程序说明: 1.特色:简繁中文切换、产品展示系统、新闻发布系统、会员管理系统、留言本计数器、网站信息统计、强大后台操作 功能等; 2.页面包括:首页、企业介绍、滚动公告通知发布系统、企业新闻系统、产品展示系统、企业案例发布展示系 统、企业招聘信息发布系统、信息资源下载系统、在线定单系统、在线客服系统、在线留言本系统、网站调查投票系统、友情连接系统、会









