標籤:逾時 nginx php fastcgi
需求:
一個php程式要跑一段時間,但是時間不確定。
問題:
當該php程式運行超過一段時間被強制中斷連線。
PHP本身逾時處理
在 php.ini 中,有一個參數 max_execution_time 可以設定 PHP 指令碼的最大執行時間,但是,在 php-cgi(php-fpm) 中,該參數不會起效。真正能夠控制 PHP 指令碼最大執行時:
<value name="request_terminate_timeout">0s</value>
就是說如果是使用 mod_php5.so 的模式運行 max_execution_time 是會生效的,但是如果是php-fpm模式中運行時不生效的。
max_execution_time
計算的只是PHP指令碼本身執行的時間,執行之外的時間都不會計算在內。哪些屬於執行之外的時間呢?包含sleep、資料互動、socket互動等等。
request_terminate_timeout = 0 即為不受時間控制,永不逾時
request_terminate_timeout引起的資源問題
request_terminate_timeout的值如果設定為0或者過長的時間,可能會引起file_get_contents的資源問題。
如果file_get_contents請求的遠端資源如果反應過慢,file_get_contents就會一直卡在那裡不會逾時。我們知道php.ini 裡面max_execution_time 可以設定 PHP 指令碼的最大執行時間,但是,在 php-cgi(php-fpm) 中,該參數不會起效。真正能夠控制 PHP 指令碼最大執行時間的是 php-fpm.conf 設定檔中的request_terminate_timeout參數。
request_terminate_timeout預設值為 0 秒,也就是說,PHP 指令碼會一直執行下去。這樣,當所有的 php-cgi 進程都卡在 file_get_contents() 函數時,這台 Nginx+PHP 的 WebServer 已經無法再處理新的 PHP 請求了,Nginx 將給使用者返回“502 Bad Gateway”。修改該參數,設定一個 PHP 指令碼最大執行時間是必要的,但是,治標不治本。例如改成 30s,如果發生 file_get_contents() 擷取網頁內容較慢的情況,這就意味著 150 個 php-cgi 進程,每秒鐘只能處理 5 個請求,WebServer 同樣很難避免”502 Bad Gateway”。解決辦法是request_terminate_timeout設定為10s或者一個合理的值,或者給file_get_contents加一個逾時參數
如果常有請求逾時,請開啟php-fpm的慢日誌,通過日誌來確認評估逾時時間。
Ngnix中的fastcgi 請求時間控制
fastcgi_connect_timeout
文法:fastcgi_connect_timeout time
預設值:fastcgi_connect_timeout 60
使用欄位:http, server, location
指定同FastCGI伺服器的連線逾時時間,這個值不能超過75秒。
fastcgi_read_timeout
文法:fastcgi_read_timeout time
預設值:fastcgi_read_timeout 60
使用欄位:http, server, location
前端FastCGI伺服器的響應逾時時間,如果有一些直到它們運行完才有輸出的長時間啟動並執行FastCGI進程,或者在錯誤記錄檔中出現前端伺服器響應逾時錯誤,可能需要調整這個值。
fastcgi_send_timeout
文法:fastcgi_send_timeout time
預設值:fastcgi_send_timeout 60
使用欄位:http, server, location
指令為上遊伺服器設定等待一個FastCGI進程的傳送資料時間,如果有一些直到它們運行完才有輸出的長時間啟動並執行FastCGI進程,那麼可以修改這個值,如果你在上有伺服器的error log裡面發現一些逾時錯誤,那麼可以恰當的增加這個值。
指令指定請求伺服器的逾時時間,指完成了2次握手的串連,而不是完整的串連,如果在這期間用戶端沒有進行資料傳遞,那麼伺服器將關閉這個串連。
在nginx+FastCGI 配置測試中
其中在request_terminate_timeout設定為永不逾時的情況下,nginx中fastcgi_read_timeout 的設定時間將影響到最終的逾時時間。
測試中,如果是php-fpm中的逾時
將顯示 502 Bad Gateway
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx</center>
</body>
</html>
如果是nginx中cgi配置逾時
將顯示 504 Gateway Time-out
<html>
<head><title>504 Gateway Time-out</title></head>
<body bgcolor="white">
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx</center>
</body>
</html>
本文出自 “章小魚兒_linux” 部落格,請務必保留此出處http://zhangxylinux.blog.51cto.com/5041623/1543035