簡(jiǎn)單談?wù)凱HP中的Reload操作
前言
有很多前輩告誡過(guò)我們,reload 能保證整個(gè)過(guò)程的平滑性,所謂平滑性指的是在 reload 的過(guò)程中,舊的進(jìn)程在處理完當(dāng)前請(qǐng)求前不會(huì)提前終止。很多年來(lái),我從來(lái)沒(méi)有質(zhì)疑過(guò)這種說(shuō)法,直到有一天,當(dāng)我 reload 的時(shí)候,出現(xiàn)了 502 錯(cuò)誤,讓我不得不重新思考。
如何重現(xiàn)問(wèn)題呢?讓我們寫(xiě)一個(gè)簡(jiǎn)單的腳本來(lái)模擬:
<?php sleep(11); echo "foo"; ?>
此時(shí)用瀏覽器瀏覽這個(gè)網(wǎng)址,接著立刻執(zhí)行 reload 操作,就能看到 502 錯(cuò)誤了。
難道 PHP 這么弱?連 reload 基本的平滑性都無(wú)法保證?答案當(dāng)然是否定的,實(shí)際上通過(guò) process_control_timeout 參數(shù)可以實(shí)現(xiàn)我們的目標(biāo)??上н@個(gè)參數(shù)缺省是 0,也就是不生效,本文把它設(shè)置成 10s。重新執(zhí)行之前的實(shí)驗(yàn)步驟,這一次正常輸出了結(jié)果。不過(guò)如果你多做幾次實(shí)驗(yàn)的話,可能會(huì)發(fā)現(xiàn)當(dāng)我們 reload 的時(shí)候,sleep 立刻就結(jié)束了,這是因?yàn)?sleep 收到 reload 發(fā)出的信號(hào)后直接返回了,下面讓我們?cè)俑膶?xiě)一下腳本:
<?php sleep(11); echo "foo"; sleep(11); echo "bar"; ?>
重新執(zhí)行之前的實(shí)驗(yàn)步驟,你會(huì)發(fā)現(xiàn) 502 錯(cuò)誤又出現(xiàn)了。這是因?yàn)?reload 雖然讓第一個(gè) sleep 立刻結(jié)束了,但是第二個(gè) sleep 還是有效的,而且超過(guò)了 process_control_timeout 的時(shí)間限制。如果我們把 process_control_timeout 設(shè)置為 12s,那么就又好了。
如此說(shuō)來(lái),我們只要給 process_control_timeout 設(shè)置一個(gè)合理的數(shù)值就能保證 reload 操作的平滑性,不過(guò)到底多大是合理的數(shù)值呢?太小的話可能起不到作用,太大的話會(huì)不會(huì)有副作用?讓我們帶著疑問(wèn)重復(fù)上一次實(shí)驗(yàn),不過(guò)這次我們?cè)偌右粋€(gè)監(jiān)控:
shell> watch -n1 'ps aux | grep php[-]fpm'
此監(jiān)控的目的是為了觀察 reload 過(guò)程中 PHP-FPM 進(jìn)程數(shù)的變化情況,為了讓效果更明顯些,建議把 PHP-FPM 的啟動(dòng)方式改成 static 模式,同時(shí)進(jìn)程數(shù)不要太多。
當(dāng)我們重復(fù)上一次實(shí)驗(yàn)的時(shí)候,結(jié)果發(fā)現(xiàn)除了正在執(zhí)行請(qǐng)求的進(jìn)程,其它進(jìn)程直接就被干掉了,而新進(jìn)程又沒(méi)有立刻啟動(dòng),就這樣一直卡到最后一個(gè)舊進(jìn)程執(zhí)行完后新進(jìn)程才完成啟動(dòng)過(guò)程。在此期間,如果有別的請(qǐng)求進(jìn)來(lái),那么無(wú)疑它無(wú)法立刻得到響應(yīng)。
根據(jù)我們的實(shí)驗(yàn)可以得出結(jié)論:缺省情況下,PHP-FPM 無(wú)法保證平滑的執(zhí)行 reload 操作,必須設(shè)置一個(gè)合理的 process_control_timeout 才行,同時(shí)需要注意的是其值不能設(shè)置的過(guò)大,否則系統(tǒng)可能出現(xiàn)更為嚴(yán)重的請(qǐng)求堵塞問(wèn)題。
總結(jié)
以上就是關(guān)于PHP中Reload操作的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
一個(gè)PHP緩存類(lèi)代碼(附詳細(xì)說(shuō)明)
一個(gè)PHP緩存類(lèi)代碼,后面都有詳細(xì)的說(shuō)明,學(xué)習(xí)php的朋友可以參考下。2011-06-06
phpinfo()中Loaded Configuration File(none)的解決方法
這篇文章主要給大家介紹了phpinfo()中Loaded Configuration File(none)問(wèn)題的解決方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-01-01
PHP mysql事務(wù)問(wèn)題實(shí)例分析
這篇文章主要介紹了PHP mysql事務(wù)問(wèn)題,結(jié)合實(shí)例形式分析了PHP操作MySQL的myisam數(shù)據(jù)庫(kù)實(shí)現(xiàn)控制事務(wù)的相關(guān)技巧,需要的朋友可以參考下2016-01-01
PHP編程之微信公眾平臺(tái)企業(yè)號(hào)驗(yàn)證接口示例【回調(diào)操作】
這篇文章主要介紹了PHP編程之微信公眾平臺(tái)企業(yè)號(hào)驗(yàn)證接口,是通過(guò)回調(diào)操作實(shí)現(xiàn)的企業(yè)號(hào)驗(yàn)證功能接口,需要的朋友可以參考下2017-08-08
PHP將HTML轉(zhuǎn)換成文本的實(shí)現(xiàn)代碼
這篇文章主要介紹了PHP將HTML轉(zhuǎn)換成文本的實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-01-01
php實(shí)現(xiàn)的RSS生成類(lèi)實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的RSS生成類(lèi),實(shí)例分析了RSS生成類(lèi)的原理、定義與使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
php打開(kāi)文件fopen函數(shù)的使用說(shuō)明
本篇文章是對(duì)php中的打開(kāi)文件fopen函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07

