【 概述 】
在PHP開發中工作里非常多使用到超時處理到超時的場合,我說幾個場景:
1. 異步獲取數據如果某個后端數據源獲取不成功則跳過,不影響整個頁面展現
2. 為了保證Web服務器不會因為當個頁面處理性能差而導致無法訪問其他頁面,則會對某些頁面操作設置
3. 對于某些上傳或者不確定處理時間的場合,則需要對整個流程中所有超時設置為無限,否則任何一個環節設置不當,都會導致莫名執行中斷
4. 多個后端模塊(html' target='_blank'>MySQL、Memcached、HTTP接口),為了防止單個接口性能太差,導致整個前面獲取數據太緩慢,影響頁面打開速度,引起雪崩
5. 。。。很多需要超時的場合
這些地方都需要考慮超時的設定,但是PHP中的超時都是分門別類,各個處理方式和策略都不同,為了系統的描述,我總結了PHP中常用的超時處理的總結。
【Web服務器超時處理】
[ Apache ]
一般在性能很高的情況下,缺省所有超時配置都是30秒,但是在上傳文件,或者網絡速度很慢的情況下,那么可能觸發超時操作。
目前 apache fastcgi php-fpm 模式 下有三個超時設置:
fastcgi 超時設置:
修改 httpd.conf 的fastcgi連接配置,類似如下:
<IfModule mod_fastcgi.c>
FastCgiExternalServer /home/forum/apache/apache_php/cgi-bin/php-cgi -socket /home/forum/php5/etc/php-fpm.sock
ScriptAlias /fcgi-bin/ "/home/forum/apache/apache_php/cgi-bin/"
AddHandler php-fastcgi .php
Action php-fastcgi /fcgi-bin/php-cgi
AddType application/x-httpd-php .php
</IfModule>
缺省配置是 30s,如果需要定制自己的配置,需要修改配置,比如修改為100秒:(修改后重啟 apache):
<IfModule mod_fastcgi.c>
FastCgiExternalServer /home/forum/apache/apache_php/cgi-bin/php-cgi -socket /home/forum/php5/etc/php-fpm.sock -idle-timeout <strong>100</strong>
ScriptAlias /fcgi-bin/ "/home/forum/apache/apache_php/cgi-bin/"
AddHandler php-fastcgi .php
Action php-fastcgi /fcgi-bin/php-cgi
AddType application/x-httpd-php .php
</IfModule>
如果超時會返回500錯誤,斷開跟后端php服務的連接,同時記錄一條apache錯誤日志:
[Thu Jan 27 18:30:15 2011] [error] [client 10.81.41.110] FastCGI: comm with server "/home/forum/apache/apache_php/cgi-bin/php-cgi" aborted: idle timeout (30 sec)
[Thu Jan 27 18:30:15 2011] [error] [client 10.81.41.110] FastCGI: incomplete headers (0 bytes) received from server "/home/forum/apache/apache_php/cgi-bin/php-cgi"其他 fastcgi 配置參數說明:
IdleTimeout 發呆時限
ProcessLifeTime 一個進程的最長生命周期,過期之后無條件kill
MaxProcessCount 最大進程個數
DefaultMinClassProcessCount 每個程序啟動的最小進程個數
DefaultMaxClassProcessCount 每個程序啟動的最大進程個數
IPCConnectTimeout 程序響應超時時間
IPCCommTimeout 與程序通訊的最長時間,上面的錯誤有可能就是這個值設置過小造成的
MaxRequestsPerProcess 每個進程最多完成處理個數,達成后自殺
[ Lighttpd ]
配置:lighttpd.conf
Lighttpd配置中,關于超時的參數有如下幾個(篇幅考慮,只寫讀超時,寫超時參數同理):
主要涉及選項:
server.max-keep-alive-idle = 5
server.max-read-idle = 60
server.read-timeout = 0
server.max-connection-idle = 360
--------------------------------------------------
# 每次keep-alive 的最大請求數, 默認值是16
server.max-keep-alive-requests = 100
# keep-alive的最長等待時間, 單位是秒,默認值是5
server.max-keep-alive-idle = 1200
# lighttpd的work子進程數,默認值是0,單進程運行
server.max-worker = 2
# 限制用戶在發送請求的過程中,最大的中間停頓時間(單位是秒),
# 如果用戶在發送請求的過程中(沒發完請求),中間停頓的時間太長,lighttpd會主動斷開連接
# 默認值是60(秒)
server.max-read-idle = 1200
# 限制用戶在接收應答的過程中,最大的中間停頓時間(單位是秒),
# 如果用戶在接收應答的過程中(沒接完),中間停頓的時間太長,lighttpd會主動斷開連接
# 默認值是360(秒)
server.max-write-idle = 12000
# 讀客戶端請求的超時限制,單位是秒, 配為0表示不作限制
# 設置小于max-read-idle時,read-timeout生效
server.read-timeout = 0
# 寫應答頁面給客戶端的超時限制,單位是秒,配為0表示不作限制
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答