当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2020-01-16 15:10:20 浏览: 评论:0 

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

话不多说直接上代码

创建的子进程:

  1. public function __construct() 
  2.  
  3.     { 
  4.  
  5.         $this->redis   = Container::get(SwooleRedis::class);//获取异步redis获取更高性能 
  6.  
  7.         $this->process = new swoole_process(function (swoole_process $process) { 
  8.  
  9.             return $this->process($process); 
  10.  
  11.         }, false, SOCK_DGRAM); 
  12.  
  13.         $this->process->name('Test_Gateway'); 
  14.  
  15.         $this->process->useQueue(); 
  16.  
  17.         $this->process->start();//启动子进程 
  18.  
  19.     } 
  20.  
  21.       
  22.  
  23.     /** 
  24.  
  25.      * 子进程处理逻辑 
  26.  
  27.      * @param swoole_process $process 
  28.  
  29.      */ 
  30.  
  31.     private function process(swoole_process $process
  32.  
  33.     { 
  34.  
  35.         $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); //异步非阻塞 
  36.  
  37.           
  38.  
  39.         $client->on("connect"function (swoole_client $cliuse ($process) { 
  40.  
  41.             $process->write('connected'); 
  42.  
  43.         }); 
  44.  
  45.           
  46.  
  47.         $client->on("receive"function (swoole_client $cli$datause ($process) { 
  48.  
  49.             $process->write($data); 
  50.  
  51.         }); 
  52.  
  53.           
  54.  
  55.         $client->on("error"function (swoole_client $cliuse ($process) { 
  56.  
  57.             $process->write('error'); 
  58.  
  59.         }); 
  60.  
  61.           
  62.  
  63.         $client->on("close"function (swoole_client $cliuse ($process) { 
  64.  
  65.             $process->write('close'); 
  66.  
  67.         }); 
  68.  
  69.           
  70.  
  71.         if ($client->connect('127.0.0.1', 90, -1)) { 
  72.  
  73.           
  74.  
  75.         } else { 
  76.  
  77.             $process->write('网关连接失败'); 
  78.  
  79.         } 
  80.  
  81.           
  82.  
  83.         swoole_event_add($process->pipe, 
  84.  
  85.             function ($pipeuse ($process$client) {//读取父进程管道消息 
  86.  
  87.                 $client->send($process->read()); 
  88.  
  89.             }); 
  90.  
  91.     } 

父进程onWorkerStart:

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

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

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

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

其他的后续补充

Tags: swoole_process

分享到: