摘要:話不多說直接上代碼創(chuàng)建的子進(jìn)程獲取異步獲取更高性能啟動子進(jìn)程子進(jìn)程處理邏輯異步非阻塞網(wǎng)關(guān)連接失敗讀取父進(jìn)程管道消息父進(jìn)程獲取子進(jìn)程的管道消息子進(jìn)程消息子進(jìn)程的客戶端可以忽略不計,本只是
話不多說直接上代碼
創(chuàng)建的子進(jìn)程:
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();//啟動子進(jìn)程 } /** * 子進(jìn)程處理邏輯 * @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("網(wǎng)關(guān)連接失敗"); } swoole_event_add($process->pipe, function ($pipe) use ($process, $client) {//讀取父進(jìn)程管道消息 $client->send($process->read()); }); }
父進(jìn)程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) {//獲取子進(jìn)程的管道消息 echo "子進(jìn)程消息:" . $process->read() . PHP_EOL; }); } }
子進(jìn)程的client客戶端可以忽略不計,本demo只是掩飾管道通信的例子
使用管道就不可以使用消息隊列:$process_push()和$process->pop();
理論上在父子進(jìn)程各注冊一個event_loop即可實現(xiàn)一邊發(fā)消息一邊接收
其他的后續(xù)補(bǔ)充
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/30929.html
摘要:消息隊列更常見的用途是主進(jìn)程分配任務(wù),子進(jìn)程消費執(zhí)行。子進(jìn)程前面加了個,這是為了防止父進(jìn)程還未往消息隊列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴(kuò)展實現(xiàn)的多進(jìn)程程序。本節(jié)給大家介紹swoole擴(kuò)展的swoole_process模塊。 swoole多進(jìn)程 swoole_process 是swoole提供的進(jìn)程管理模塊,用來替代PHP的pcntl擴(kuò)展。 首先,確保安裝的swoole...
摘要:本文使用與完成一個的進(jìn)程池,并且支持動態(tài)創(chuàng)建新進(jìn)程。接著遍歷所有的進(jìn)程,并且加入中,設(shè)置可讀事件,用于接收子進(jìn)程的空閑信號。最后每隔一秒向進(jìn)程投遞任務(wù)。由于只模擬了十次任務(wù),則第十個任務(wù)完成之后在父進(jìn)程中發(fā)送使所有子進(jìn)程退出。 swoole_process 主要是用來代替 PHP 的 pcntl 擴(kuò)展。我們知道 pcntl 是用來進(jìn)行多進(jìn)程編程的,而 pcntl 只提供了 fork 這...
摘要:從入門到放棄三一進(jìn)程子進(jìn)程創(chuàng)建成功后要執(zhí)行的函數(shù)重定向子進(jìn)程的標(biāo)準(zhǔn)輸入和輸出。默認(rèn)為阻塞讀取。是否創(chuàng)建管道,啟用后,此選項將忽略用戶參數(shù),強(qiáng)制為。 swoole——從入門到放棄(三) 一、進(jìn)程 swoole_process SwooleProcess swoole_process::__construct(callable $function, $redirect_stdin...
摘要:從入門到放棄三一進(jìn)程子進(jìn)程創(chuàng)建成功后要執(zhí)行的函數(shù)重定向子進(jìn)程的標(biāo)準(zhǔn)輸入和輸出。默認(rèn)為阻塞讀取。是否創(chuàng)建管道,啟用后,此選項將忽略用戶參數(shù),強(qiáng)制為。 swoole——從入門到放棄(三) 一、進(jìn)程 swoole_process SwooleProcess swoole_process::__construct(callable $function, $redirect_stdin...
閱讀 939·2021-11-22 12:09
閱讀 3710·2021-09-27 13:36
閱讀 1397·2021-08-20 09:37
閱讀 4017·2019-12-27 12:22
閱讀 2360·2019-08-30 15:55
閱讀 2364·2019-08-30 13:16
閱讀 2822·2019-08-26 17:06
閱讀 3440·2019-08-23 18:32