ホームページ  >  記事  >  バックエンド開発  >  swoole_process 親子プロセスのパイプライン通信のコード例

swoole_process 親子プロセスのパイプライン通信のコード例

不言
不言転載
2019-03-04 13:50:232748ブラウズ

この記事では、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;
                });
        }
    }
  • 子プロセスのクライアントは無視できます。このデモは、パイプ通信のマスキングの一例にすぎません。
  • パイプを使用する場合、メッセージ キューは使用できません: $process_push() および $process-> Pop();
  • 理論的には、親プロセスと子プロセスのそれぞれにevent_loopを登録することで、メッセージの送信と受信を同時に行うことができます。
  • その他のフォローアップの追加

以上がswoole_process 親子プロセスのパイプライン通信のコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。