A-A+

swoole_process父子进程管道通信的代码示例

2020年01月18日 我爱编程 暂无评论

本篇文章给大家带来的内容是关于swoole_process父子进程管道通信的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

话不多说直接上代码

创建的子进程:

  1. public function __construct()
  2.     {
  3.         $this->redis   = Container::get(SwooleRedis::class);//获取异步redis获取更高性能
  4.         $this->process = new swoole_process(function (swoole_process $process) {
  5.             return $this->process($process);
  6.         }, false, SOCK_DGRAM);
  7.         $this->process->name('Test_Gateway');
  8.         $this->process->useQueue();
  9.         $this->process->start();//启动子进程
  10.     }
  11.     /**
  12.      * 子进程处理逻辑
  13.      * @param swoole_process $process
  14.      */
  15.     private function process(swoole_process $process)
  16.     {
  17.         $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); //异步非阻塞
  18.         $client->on("connect"function (swoole_client $cliuse ($process) {
  19.             $process->write('connected');
  20.         });
  21.         $client->on("receive"function (swoole_client $cli$datause ($process) {
  22.             $process->write($data);
  23.         });
  24.         $client->on("error"function (swoole_client $cliuse ($process) {
  25.             $process->write('error');
  26.         });
  27.         $client->on("close"function (swoole_client $cliuse ($process) {
  28.             $process->write('close');
  29.         });
  30.         if ($client->connect('127.0.0.1', 90, -1)) {
  31.         } else {
  32.             $process->write('网关连接失败');
  33.         }
  34.         swoole_event_add($process->pipe,
  35.             function ($pipeuse ($process$client) {//读取父进程管道消息
  36.                 $client->send($process->read());
  37.             });
  38.     }

父进程onWorkerStart:

  1. /**
  2.      * @param swoole_server $serv
  3.      * @param               $worker_id
  4.      */
  5.     public function onWorkerStart(\swoole_server $serv$worker_id)
  6.     {
  7.         if ($worker_id === 0) {
  8.             swoole_timer_tick(1000, function () {
  9.                 $this->process->write('ping');
  10.             });
  11.             $process = $this->process;
  12.             swoole_event_add($process->pipe,
  13.                 function ($pipeuse ($process) {//获取子进程的管道消息
  14.                     echo "子进程消息:" . $process->read() . PHP_EOL;
  15.                 });
  16.         }
  17.     }

子进程的client客户端可以忽略不计,本demo只是掩饰管道通信的例子

使用管道就不可以使用消息队列:$process_push()和$process->pop();

理论上在父子进程各注册一个event_loop即可实现一边发消息一边接收

其他的后续补充

给我留言

Copyright © 四季博客 保留所有权利.   Theme  Ality

用户登录