欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php-fpm?reload?會取消正在處理請求的解決方案

 更新時(shí)間:2022年09月22日 14:13:05   作者:weapon???????  
這篇文章主要介紹了php-fpm?reload?會取消正在處理請求的解決方案,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

起步

在測試中,發(fā)現(xiàn) php-fpm reload 會強(qiáng)制 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 信號實(shí)現(xiàn)自身服務(wù)的 reload:

kill -USR2 <pid>

主進(jìn)程(master進(jìn)程)收到 reload 信號,會向所有子進(jìn)程發(fā)送 SIGGUIT 信號,同時(shí)注冊定時(shí)器時(shí)間,timeout 的值為 fpm_global_config.process_control_timeout 。在規(guī)定時(shí)間之內(nèi)子進(jìn)程還沒有結(jié)束,則子進(jìn)程將被 kill 。比如 timeout 值設(shè)為1秒,如果在 1 秒之內(nèi)還沒有結(jié)束,則直接向子進(jìn)程發(fā)送 SIGKILL 信號,強(qiáng)制殺死。

最后 master 等待所有的子進(jìn)程結(jié)束后,根據(jù)之前保存的啟動參數(shù)重新啟動一個進(jìn)程,并繼承父進(jìn)程的 socket 文件描述符。

緩兵之計(jì)

注意,這只是緩解的方案,依然不能保證請求不會丟失。這個方案在于 process_control_timeout 這個配置選項(xiàng),配置文件在 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é)果,正在處理的請求只要在該時(shí)間內(nèi)完成請求,就能正常返回。

這不是 100% 的方案是因?yàn)?,master 進(jìn)程要等待所有子進(jìn)程結(jié)束才會重新創(chuàng)建 worker 進(jìn)程,而 process_control_timeout 等待的時(shí)候,worker 進(jìn)程不接受請求了,因此這段時(shí)間內(nèi)新的請求進(jìn)不來,這些新請求將由 fpm 排隊(duì),nginx 若超時(shí)會報(bào) 502 給用戶,保險(xiǎn)起見,nginx 的超時(shí)時(shí)間的值應(yīng)該是 process_control_timeout 的兩倍。

盡管可能會報(bào) 502 ,但這樣的處理方式比殺死正在處理的請求讓人接受的多了。

總結(jié)

盡管設(shè)置了 process_control_timeout ,在上述情況之上,PHP-FPM 在 reload 完成之前不會為新請求提供服務(wù)。但是,所有這些新請求將由 fpm 排隊(duì),并在重新加載完成后立即執(zhí)行。最終用戶的結(jié)果是,在此期間,他們看到瀏覽器顯示加載中。另一點(diǎn)是設(shè)置的超時(shí),也不能保證請求在這個時(shí)間內(nèi)處理完,還是需要程序員保證自己的腳本運(yùn)行時(shí)間在合理范圍內(nèi)。

到此這篇關(guān)于php-fpm reload 會取消正在處理請求的解決方案的文章就介紹到這了,更多相關(guān)php-fpm reload 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論