日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swoole 自定义项目初始化事件处理的实现

發布時間:2025/3/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swoole 自定义项目初始化事件处理的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

最近使用基于 Swoole 開發的 imi 框架 開發項目,碰到一個需求,就是想要做項目初始化處理。當初始化處理完成前,不想讓 Swoole 處理請求。因為可能有一些值沒有加載進來,處理請求極有可能出現問題。

下面給出了思考過程及解決問題的demo代碼。

首先分析了一下,Swoole 是多進程模式運行的,分為 Master、Manager、Worker 進程。

Master 進程就是我們啟動服務的 cli 命令文件所在進程,在這里面初始化有一個問題,這里所有加載的類、全局變量,其它 Worker 進程里都可以使用,無法熱重啟生效。

Manager 進程的情況基本和上面差不多。

那么只有在 Worker 進程做處理了,但如果寫在 WorkerStart 事件里,每個 Worker 進程都會去執行。

WorkerStart 事件定義:

function onWorkerStart(swoole_server $server, int $worker_id);

$worker_id是一個從0-$worker_num之間的數字,表示這個Worker進程的ID

那這個就好辦了,直接判斷workerid為0的去觸發項目初始化事件。剩下還有一個問題就是,如何在初始化執行完成前,讓所有 Worker 進程暫時都不處理請求。

思考并嘗試了一下,這個問題可以通過協程掛起來解決,demo 代碼如下:

<?phpuse Swoole\Coroutine;$http = new swoole_http_server('127.0.0.1', 8080);$http->on('WorkerStart', function(swoole_http_server $server, $workerId){$initFlagFile = __DIR__ . '/init.flag';if(0 === $server->worker_id && (!is_file($initFlagFile) || file_get_contents($initFlagFile) != $server->manager_pid)){// 處理項目初始化事件initApp();// 寫入文件,保證不再重復觸發項目初始化事件file_put_contents($initFlagFile, $server->manager_pid);// 當前worker進程恢復協程resumeCos();// 通知其它worker進程for($i = 1; $i < $server->setting['worker_num']; ++$i){$server->sendMessage('init', $i);}} });$http->on('PipeMessage', function(swoole_http_server $server, $srcWorkerId, $data) {if(0 === $srcWorkerId && 'init' === $data && !defined('APP_INITED')){// 其它worker進程恢復協程resumeCos();} });$http->on('request', function (swoole_http_request $request, swoole_http_response $response) {// 判斷未初始化完畢,則掛起協程if(!defined('APP_INITED')){$GLOBALS['WORKER_START_END_RESUME_COIDS'][] = Coroutine::getuid();Coroutine::suspend();}$response->header('content-type', 'text/html;charset=utf-8');$response->end('IMI 是一款基于 Swoole 開發的協程 PHP 開發框架,擁有常駐內存、協程異步非阻塞IO等優點。官方網站:<a href="https://imiphp.com" target="_blank">https://imiphp.com</a>'); });$http->start();/*** 處理項目初始化事件,比如這里延時5秒,模擬初始化處理** @return void*/ function initApp() {$count = 5;for($i = 0; $i < $count; ++$i){echo 'initing ', ($i + 1), '/', $count, PHP_EOL;sleep(1);} }/*** 恢復協程** @return void*/ function resumeCos() {define('APP_INITED', true);$coids = $GLOBALS['WORKER_START_END_RESUME_COIDS'] ?? [];fwrite(STDOUT, 'suspend co count: ' . count($coids) . PHP_EOL);foreach($coids as $id){Coroutine::resume($id);} }

通過在 request 事件中判斷是否初始化完畢,如果沒有初始化完成,則掛起當前協程,將協程ID加入全局變量。

當第0個 worker 進程執行完初始化后,通過向其他 worker 進程發送消息,喚醒曾經掛起的協程們,在初始化期間進來的請求,這時候會被執行。

轉載于:https://my.oschina.net/yurun/blog/2050809

總結

以上是生活随笔為你收集整理的Swoole 自定义项目初始化事件处理的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 伊人夜色 | 白丝动漫美女 | 日韩视频免费 | 国产女人呻吟高潮抽搐声 | 亚洲操图 | 国产激情网站 | 成人免费视频一区 | 国产精品熟妇一区二区三区四区 | 欧美日韩在线免费视频 | 国产黄色大片免费看 | 午夜影院性| 与子敌伦刺激对白播放的优点 | 91视频久久久 | 乳罩脱了喂男人吃奶视频 | 久久久久久久久久综合 | 国产精品五月天 | 夜夜久久久 | 国产精品久久999 | 成人午夜电影网站 | 亚洲四区在线 | 人人插人人看 | 美女张开腿让人桶 | 国产精品久久久一区 | 亚洲在线免费视频 | 网爆门在线 | 手机av电影在线 | 国内自拍av | 干丰满少妇| 99久久99久久精品国产片果冻 | 黄色三级三级 | 欧美午夜一区 | 欧美精品1区2区3区 精品成人一区 | 在线视频亚洲欧美 | 男女啪啪av | 久久影院精品 | 国产喷水视频 | 黄色av导航 | 美女黄色一级片 | 国产超碰人人模人人爽人人添 | av网站免费播放 | 爽爽爽av | 青青草97国产精品免费观看 | 最新国产网站 | 99精品久久久久久中文字幕 | 交专区videossex非洲 | 成人xx视频| av香港经典三级级 在线 | av超碰在线观看 | 国产精品久久久久久久av福利 | 国产精品欧美一区二区三区 | 亚洲一区二区三区免费视频 | 中文字幕乱伦视频 | 久草热在线 | 国产人妖在线播放 | 国产一区二区三区四区精 | 91久久久久久久久 | 久久久96人妻无码精品 | 噼里啪啦动漫高清在线观看 | 欧美成人一二区 | 免费涩涩| 色黄视频在线观看 | 91成人入口 | 久久99精品久久久久久 | 日韩一区二区三区不卡视频 | 一卡二卡三卡四卡 | 欧美不在线 | 成人av手机在线观看 | a视频在线| 中文字幕狠狠干 | 亚洲综合在线观看视频 | 欧美日韩亚洲一区 | 国产在线激情视频 | www.色日本 | 特一级黄色片 | av在线h| 污漫网站 | 日本欧美黄色 | 日本免费一区视频 | 第一色综合 | 伊人3 | 欧美一级二级片 | 美女三级黄色片 | 色图自拍偷拍 | 极品探花在线观看 | 婷婷色六月| 777久久久精品一区二区三区 | 黄色不卡av | 久久在线免费观看视频 | 欧美顶级metart裸体全部自慰 | 国产 日韩 欧美 精品 | 男人av资源网 | 91人人干 | 精品国产色| 亚洲综合激情在线 | 成人久久精品人妻一区二区三区 | www.youjizz.com日本 | 亚洲免费综合 | 午夜视频一区二区三区 | 99er在线观看 |