亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

詳解PHP解決守護(hù)進(jìn)程Redis假死

瀏覽:15日期:2022-09-07 08:15:24
目錄一、一個(gè)簡單的守護(hù)進(jìn)程示例二、一個(gè)不再假死(偽活)的 Redis 常駐進(jìn)程示例一、一個(gè)簡單的守護(hù)進(jìn)程示例

<?php$redis = new Redis();$redis->connect(’localhost’, 6379);$redis->auth(’xxxxx’); // Redis 密碼如果沒有設(shè)置為空字符串。$redis->select(1);$queueKey = ’redis_queue_services_key’; // 業(yè)務(wù)數(shù)據(jù)隊(duì)列。$queueIngKey = ’redis_queue_services_ing_key’; // 處理中的隊(duì)列。try { while (true) {$element = $redis->bRPopLPush($queueKey, $queueIngKey, 60);if ($element) { $data = json_decode($element, true); /** * ...... 此處省略業(yè)務(wù)邏輯 ...... * */} else { usleep(100000); // 睡眠 0.1 秒。} }} catch (Exception $e) { exit('Error:{$e->getMessage()}');}

這段代碼我們很容易看懂。

它就是通過Redis的阻塞方法bRPopLPush循環(huán)從 Redis 隊(duì)列中取出數(shù)據(jù)并處理。如果沒有取到數(shù)據(jù)就休眠一秒。之所以休眠是為了保證 CPU 能得到充分的利用。因?yàn)椋覀円呀?jīng)使用了阻塞方法阻塞 60 秒。所以,這個(gè)位置休眠與否并不重要。

當(dāng)我們的業(yè)務(wù)出現(xiàn)任何錯(cuò)誤,我們通過try catch進(jìn)行異常捕獲然后將錯(cuò)誤信息直接輸出并退當(dāng)前腳本。

博主寒冰第一次編寫常駐后臺(tái)運(yùn)行的守護(hù)進(jìn)程時(shí),就是如上這種方式寫的代碼。結(jié)果,這段代碼運(yùn)行到 30s 的時(shí)候報(bào)錯(cuò)了。提示我們 socket 流超時(shí)。于是我在這個(gè)腳本頭部加了如下代碼:

ini_set(’default_socket_timeout’, -1);

這樣我們的PHP就不會(huì)主動(dòng)段掉我們與 Redis 的 socket 連接了。

但是,好景不長。過了一段時(shí)間,大概半個(gè)月吧。運(yùn)維同學(xué)告訴我 Redis 隊(duì)列的數(shù)據(jù)出現(xiàn)了未消費(fèi)的情況。然后,我查看了消費(fèi)日志。的確沒有產(chǎn)生新的消費(fèi)日志。因?yàn)槲矣幸粋€(gè)習(xí)慣,每個(gè)消費(fèi)消費(fèi)的時(shí)候都會(huì)把成功消費(fèi)的日志寫到文件中。消費(fèi)失敗的也寫入日志文件中。這樣,我就知道失敗的具體原因。

但是,這次我真的沒有發(fā)現(xiàn)有任何的錯(cuò)誤發(fā)生。

常駐后臺(tái)進(jìn)程處理存活狀態(tài)。并沒有變成孤兒進(jìn)程。 常駐后臺(tái)進(jìn)程內(nèi)存也沒有出現(xiàn)泄漏。 系統(tǒng) CPU/內(nèi)存 資源都處理正在狀態(tài)。 系統(tǒng)打開的句柄資源也是低消狀態(tài)。 帶寬也處理低消狀態(tài)。 其它常駐進(jìn)程也處理正常消費(fèi)的工作狀態(tài)。也就排除了 Redis 故障的問題。

我當(dāng)時(shí)也懷疑過是不是像MySQL一樣常時(shí)間連接不進(jìn)行任何操作,服務(wù)器端會(huì)主動(dòng)斷開連接。但是,MySQL 服務(wù)器端主動(dòng)段掉連接會(huì)提示:MySQL server has gone away的錯(cuò)誤。但是,我們的 Redis 服務(wù)器端沒有給我們報(bào)任何錯(cuò)誤信息呀。

我們公司用的是阿里云的 Redis 產(chǎn)品。我懷疑是不是 Redis 版本太低造成的這個(gè)隱性 BUG。于是,我們將阿里云的 Redis 服務(wù)升級(jí)到了阿里云支持的最新版本。

結(jié)果還是失敗了。我們的 Redis 還是假死了。或者說我們的 Redis 處于偽活狀態(tài)。

你認(rèn)為 Redis 活著,其實(shí)它早已經(jīng)死了。你認(rèn)為 Redis 死了,但是它卻沒有死亡的特征。

最后,我冷靜下來。

我假定此時(shí)的 Redis 已經(jīng)死了。只是沒有告訴客戶端而已。那么我只需要每次檢測(cè)一下 Redis 連接是否存活就好了。

于是,我翻看了 Redis 的 API。發(fā)現(xiàn)它提供了一個(gè)ping()的方法來檢測(cè)連接是否存活。

二、一個(gè)不再假死(偽活)的 Redis 常駐進(jìn)程示例

<?php$redis = new Redis();$redis->connect(’localhost’, 6379);$redis->auth(’xxxxx’); // Redis 密碼如果沒有設(shè)置為空字符串。$redis->select(1);$queueKey = ’redis_queue_services_key’; // 業(yè)務(wù)數(shù)據(jù)隊(duì)列。$queueIngKey = ’redis_queue_services_ing_key’; // 處理中的隊(duì)列。try { while (true) {$element = $redis->bRPopLPush($queueKey, $queueIngKey, 60);if ($element) { $data = json_decode($element, true); /** * ...... 此處省略業(yè)務(wù)邏輯 ...... * */} else { $pong = $redis->ping(); if ($pong != ’+PONG’) {throw new Exception(’Redis ping failure!’, 500); } usleep(100000); // 睡眠 0.1 秒。} }} catch (Exception $e) { exit('Error:{$e->getMessage()}');}

通過代碼對(duì)比,我們?cè)诘谝话娲a的基礎(chǔ)上加了如下代碼:

$pong = $redis->ping();if ($pong != ’+PONG’) { throw new Exception(’Redis ping failure!’, 500);}

我們向 Redis 服務(wù)器發(fā)送ping的時(shí)候,服務(wù)器會(huì)返回+PONG字符串。當(dāng)然,這個(gè)是 Redis 擴(kuò)展封裝過的方法。真正的 ping 是不會(huì)有 + 號(hào)的。

當(dāng)我們每次 ping 的時(shí)候,Redis 服務(wù)器就會(huì)認(rèn)為我們的 Redis 客戶端連接處于存活狀態(tài)。就不會(huì)斷掉我們的連接了。

把代碼進(jìn)行改造之后,假死頭痛的問題再也沒出現(xiàn)了。

以上就是詳解PHP解決守護(hù)進(jìn)程Redis假死的詳細(xì)內(nèi)容,更多關(guān)于PHP解決守護(hù)進(jìn)程Redis假死的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 国产视频一区二区在线观看 | 国产精品400部自产在线观看 | 久久久久久一级毛片免费野外 | 一区二区欧美视频 | 色综合a| 亚洲午夜精品一区二区 | 亚洲国产欧美日韩精品一区二区三区 | 午夜精品久久久久久影视riav | 黄色不卡视频 | 黄色小视频免费 | 伊人三级 | 日本在线三级 | 亚洲xxxxxx| 看一级特黄a大一片 | a毛片在线看片免费 | 欧美zoofilia杂交videos动漫 | 亚洲韩精品欧美一区二区三区 | 欧洲免费极品videos | 日韩在线国产 | 欧美激情一区二区三区蜜桃视频 | 国产一区二区网站 | 爽爽影院色黄网站在线观看 | 妖精视频在线播放 | 激情婷婷在线 | 亚洲手机在线 | 玖玖香蕉视频 | 精品午夜久久影视 | 色婷婷久久免费网站 | 久久一本久综合久久爱 | 成人免费视频视频在线不卡 | 日韩成人中文字幕 | 麻豆va在线精品免费播放 | 色花堂国产精品第二页 | 国产www在线观看 | 亚洲精品欧美一区二区三区 | 尤物精品视频在线观看 | 一级黄色免费大片 | 成人午夜视频在线观 | 日本一线一区二区三区免费视频 | 国产娱乐凹凸视觉盛宴在线视频 | 免费毛片无需任何播放器 |