php-fpm?reload?會取消正在處理請求的解決方案
起步
在測試中,發(fā)現(xiàn) php-fpm reload 會強制 kill 掉正在處理的請求。網(wǎng)上查了一下,發(fā)現(xiàn)其他人也有這個問題并反饋給了官方:和 https://bugs.php.net/bug.php?id=60961,帖子是 2017 和 2012 年的,到現(xiàn)在還沒解決。
官方幫助手冊還說 reload 是 graceful ,啊哈哈,不要太相信:
man php-fpm
...
SIGINT,SIGTERM
immediate termination
SIGQUIT
graceful stop
SIGUSR1
re-open log file
SIGUSR2
graceful reload of all workers + reload of fpm conf/binary
...reload 流程簡介
php-fpm 是 master worker 的工作方式。
php-fpm master 進(jìn)程通過接受用戶發(fā)送的 SIGUSR2 信號實現(xiàn)自身服務(wù)的 reload:
kill -USR2 <pid>
主進(jìn)程(master進(jìn)程)收到 reload 信號,會向所有子進(jìn)程發(fā)送 SIGGUIT 信號,同時注冊定時器時間,timeout 的值為 fpm_global_config.process_control_timeout 。在規(guī)定時間之內(nèi)子進(jìn)程還沒有結(jié)束,則子進(jìn)程將被 kill 。比如 timeout 值設(shè)為1秒,如果在 1 秒之內(nèi)還沒有結(jié)束,則直接向子進(jìn)程發(fā)送 SIGKILL 信號,強制殺死。
最后 master 等待所有的子進(jìn)程結(jié)束后,根據(jù)之前保存的啟動參數(shù)重新啟動一個進(jìn)程,并繼承父進(jìn)程的 socket 文件描述符。
緩兵之計
注意,這只是緩解的方案,依然不能保證請求不會丟失。這個方案在于 process_control_timeout 這個配置選項,配置文件在 php-fpm.conf (我的是在 /usr/local/etc/php-fpm.conf)中,默認(rèn)值是 0 ,會立即將子進(jìn)程 kill 掉,這里我改為了 60s 進(jìn)行測試:
; Time limit for child processes to wait for a reaction on signals from master. ; Available units: s(econds), m(inutes), h(ours), or d(ays) ; Default Unit: seconds ; Default Value: 0 process_control_timeout = 60s
測試結(jié)果,正在處理的請求只要在該時間內(nèi)完成請求,就能正常返回。
這不是 100% 的方案是因為,master 進(jìn)程要等待所有子進(jìn)程結(jié)束才會重新創(chuàng)建 worker 進(jìn)程,而 process_control_timeout 等待的時候,worker 進(jìn)程不接受請求了,因此這段時間內(nèi)新的請求進(jìn)不來,這些新請求將由 fpm 排隊,nginx 若超時會報 502 給用戶,保險起見,nginx 的超時時間的值應(yīng)該是 process_control_timeout 的兩倍。
盡管可能會報 502 ,但這樣的處理方式比殺死正在處理的請求讓人接受的多了。
總結(jié)
盡管設(shè)置了 process_control_timeout ,在上述情況之上,PHP-FPM 在 reload 完成之前不會為新請求提供服務(wù)。但是,所有這些新請求將由 fpm 排隊,并在重新加載完成后立即執(zhí)行。最終用戶的結(jié)果是,在此期間,他們看到瀏覽器顯示加載中。另一點是設(shè)置的超時,也不能保證請求在這個時間內(nèi)處理完,還是需要程序員保證自己的腳本運行時間在合理范圍內(nèi)。
到此這篇關(guān)于php-fpm reload 會取消正在處理請求的解決方案的文章就介紹到這了,更多相關(guān)php-fpm reload 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP實現(xiàn)移除數(shù)組中為空或為某值元素的方法
這篇文章主要介紹了PHP實現(xiàn)移除數(shù)組中為空或為某值元素的方法,涉及php使用array_filter過濾數(shù)組的相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
php array_intersect比array_diff快(附詳細(xì)的使用說明)
在PHP中,使用 array_intersect 求兩個數(shù)組的交集比使用 array_diff 求同樣兩個數(shù)組的并集要快。2011-07-07
php中foreach結(jié)合curl實現(xiàn)多線程的方法分析
這篇文章主要介紹了php中foreach結(jié)合curl實現(xiàn)多線程的方法,結(jié)合實例形式分析了foreach語句結(jié)合curl循環(huán)調(diào)用模擬多線程的原理與實現(xiàn)技巧,需要的朋友可以參考下2016-09-09
thinkphp關(guān)于簡單的權(quán)限判定方法
下面小編就為大家?guī)硪黄猼hinkphp關(guān)于簡單的權(quán)限判定方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
zend Framework中的Layout(模塊化得布局)詳解
本篇文章是對zend Framework中的Layout(模塊化得布局)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
PHP實現(xiàn)生成vcf vcard文件功能類定義與使用方法詳解【附demo源碼下載】
這篇文章主要介紹了PHP實現(xiàn)生成vcf vcard文件功能類定義與使用方法,結(jié)合具體實例形式分析了vcf vcard功能類的具體定義與使用方法,并附帶VCardIFL.class.php類文件源碼供讀者下載參考,需要的朋友可以參考下2017-09-09
PHP7擴展開發(fā)之hello word實現(xiàn)方法詳解
這篇文章主要介紹了PHP7擴展開發(fā)之hello word實現(xiàn)方法,結(jié)合實例形式分析了php7擴展開發(fā)的具體步驟與相關(guān)操作技巧,涉及針對php底層源碼的修改與編譯,需要的朋友可以參考下2018-01-01

