Exemple de code de communication avec le pipeline de processus parent-enfant swoole_process

不言
Libérer: 2023-04-05 13:46:01
avant
2740 Les gens l'ont consulté

Le contenu de cet article concerne l'exemple de code de la communication par pipeline de processus parent-enfant swoole_process. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Sans plus tarder, passons directement au code

Processus enfant créé :

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());
            });
    }
Copier après la connexion

Processus parent 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;
                });
        }
    }
Copier après la connexion
  • Le client du processus enfant peut être ignoré. Cette démo n'est qu'un exemple de masquage de communication par canal
  • Vous ne pouvez pas utiliser la file d'attente de messages lorsque vous utilisez des canaux : $process_push() et $process. ->pop( ;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal