Codebeispiel für die Pipeline-Kommunikation zwischen übergeordneten und untergeordneten Prozessen von swoole_process

不言
Freigeben: 2023-04-05 13:46:01
nach vorne
2739 Leute haben es durchsucht

Der Inhalt dieses Artikels handelt vom Codebeispiel der Eltern-Kind-Prozess-Pipeline. Es hat einen gewissen Referenzwert. Ich hoffe, es wird für Sie hilfreich sein.

Ohne weitere Umschweife kommen wir direkt zum Code

Erstellter untergeordneter Prozess:

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());
            });
    }
Nach dem Login kopieren

Übergeordneter Prozess 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;
                });
        }
    }
Nach dem Login kopieren
  • Der Client des untergeordneten Prozesses kann ignoriert werden.
  • Sie können die Nachrichtenwarteschlange nicht verwenden, wenn Sie Pipes verwenden: $process_push() und $process->pop ();
  • Theoretisch können Sie durch die Registrierung einer event_loop in jedem der übergeordneten und untergeordneten Prozesse Nachrichten gleichzeitig senden und empfangen
  • Andere Folgeergänzungen

Das obige ist der detaillierte Inhalt vonCodebeispiel für die Pipeline-Kommunikation zwischen übergeordneten und untergeordneten Prozessen von swoole_process. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage