程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP超時處理全面總結(1)

PHP超時處理全面總結(1)

編輯:關於PHP編程

【 概述 】

在PHP開發中工作裡非常多使用到超時處理到超時的場合,我說幾個場景:

1. 異步獲取數據如果某個後端數據源獲取不成功則跳過,不影響整個頁面展現

2. 為了保證Web服務器不會因為當個頁面處理性能差而導致無法訪問其他頁面,則會對某些頁面操作設置

3. 對於某些上傳或者不確定處理時間的場合,則需要對整個流程中所有超時設置為無限,否則任何一個環節設置不當,都會導致莫名執行中斷

4. 多個後端模塊(MySQL、Memcached、HTTP接口),為了防止單個接口性能太差,導致整個前面獲取數據太緩慢,影響頁面打開速度,引起雪崩

5. 。。。很多需要超時的場合

這些地方都需要考慮超時的設定,但是PHP中的超時都是分門別類,各個處理方式和策略都不同,為了系統的描述,我總結了PHP中常用的超時處理的總結。

【Web服務器超時處理】

[ Apache ]

一般在性能很高的情況下,缺省所有超時配置都是30秒,但是在上傳文件,或者網絡速度很慢的情況下,那麼可能觸發超時操作。

目前 apache fastcgi php-fpm 模式 下有三個超時設置:

fastcgi 超時設置:

修改 httpd.conf 的fastcgi連接配置,類似如下:

  1. <IfModule mod_fastcgi.c>   
  2.     FastCgiExternalServer /home/forum/apache/apache_php/cgi-bin/php-cgi -socket /home/forum/php5/etc/php-fpm.sock  
  3.  
  4.     ScriptAlias /fcgi-bin/ "/home/forum/apache/apache_php/cgi-bin/"  
  5.  
  6.     AddHandler php-fastcgi .php  
  7.  
  8.     Action php-fastcgi /fcgi-bin/php-cgi  
  9.  
  10.     AddType application/x-httpd-php .php  
  11.  
  12. </IfModule> 

缺省配置是 30s,如果需要定制自己的配置,需要修改配置,比如修改為100秒:(修改後重啟 apache):

  1. <IfModule mod_fastcgi.c> 
  2.  
  3.     FastCgiExternalServer /home/forum/apache/apache_php/cgi-bin/php-cgi -socket /home/forum/php5/etc/php-fpm.sock  -idle-timeout 100  
  4.  
  5.     ScriptAlias /fcgi-bin/ "/home/forum/apache/apache_php/cgi-bin/"  
  6.  
  7.     AddHandler php-fastcgi .php  
  8.  
  9.     Action php-fastcgi /fcgi-bin/php-cgi  
  10.  
  11.     AddType application/x-httpd-php .php  
  12.  
  13. </IfModule> 

如果超時會返回500錯誤,斷開跟後端php服務的連接,同時記錄一條apache錯誤日志:

  1. [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)  
  2.  
  3. [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 配置參數說明:

  1. IdleTimeout 發呆時限   
  2. ProcessLifeTime 一個進程的最長生命周期,過期之後無條件kill  
  3.  
  4. MaxProcessCount 最大進程個數  
  5.  
  6. DefaultMinClassProcessCount 每個程序啟動的最小進程個數  
  7.  
  8. DefaultMaxClassProcessCount 每個程序啟動的最大進程個數  
  9.  
  10. IPCConnectTimeout 程序響應超時時間  
  11.  
  12. IPCCommTimeout 與程序通訊的最長時間,上面的錯誤有可能就是這個值設置過小造成的  
  13.  
  14. MaxRequestsPerProcess 每個進程最多完成處理個數,達成後自殺 

[ Lighttpd ]

配置:lighttpd.conf

Lighttpd配置中,關於超時的參數有如下幾個(篇幅考慮,只寫讀超時,寫超時參數同理):

主要涉及選項:

  1. server.max-keep-alive-idle = 5 
  2.  
  3. server.max-read-idle = 60 
  4.  
  5. server.read-timeout = 0 
  6.  
  7. server.max-connection-idle = 360 
  1. --------------------------------------------------  
  2.  
  3. # 每次keep-alive 的最大請求數, 默認值是16  
  4.  
  5. server.max-keep-alive-requests = 100 
  6.  
  7. # keep-alive的最長等待時間, 單位是秒,默認值是5  
  8.  
  9. server.max-keep-alive-idle = 1200 
  10.  
  11. # lighttpd的work子進程數,默認值是0,單進程運行  
  12.  
  13. server.max-worker = 2 
  14.  
  15. # 限制用戶在發送請求的過程中,最大的中間停頓時間(單位是秒),  
  16.  
  17. # 如果用戶在發送請求的過程中(沒發完請求),中間停頓的時間太長,lighttpd會主動斷開連接  
  18.  
  19. # 默認值是60(秒)  
  20.  
  21. server.max-read-idle = 1200 
  22.  
  23. # 限制用戶在接收應答的過程中,最大的中間停頓時間(單位是秒),  
  24.  
  25. # 如果用戶在接收應答的過程中(沒接完),中間停頓的時間太長,lighttpd會主動斷開連接  
  26.  
  27. # 默認值是360(秒)  
  28.  
  29. server.max-write-idle = 12000 
  30.  
  31. # 讀客戶端請求的超時限制,單位是秒, 配為0表示不作限制  
  32.  
  33. # 設置小於max-read-idle時,read-timeout生效  
  34.  
  35. server.read-timeout = 0 
  36.  
  37. # 寫應答頁面給客戶端的超時限制,單位是秒,配為0表示不作限制  
  38.  
  39. # 設置小於max-write-idle時,write-timeout生效  
  40.  
  41. server.write-timeout = 0 
  42.  
  43. # 請求的處理時間上限,如果用了mod_proxy_core,那就是和後端的交互時間限制, 單位是秒  
  44.  
  45. server.max-connection-idle = 1200 
  46.  
  47. -------------------------------------------------- 

說明:

對於一個keep-alive連接上的連續請求,發送第一個請求內容的最大間隔由參數max-read-idle決定,從第二個請求起,發送請求內容的最大間隔由參數max-keep-alive-idle決定。請求間的間隔超時也由max-keep-alive-idle決定。發送請求內容的總時間超時由參數read-timeout決定。Lighttpd與後端交互數據的超時由max-connection-idle決定。

延伸閱讀:

http://www.snooda.com/read/244

[ Nginx ]

配置:nginx.conf

  1. http {   
  2.  
  3.     #Fastcgi: (針對後端的fastcgi 生效, fastcgi 不屬於proxy模式)  
  4.  
  5.     fastcgi_connect_timeout 5;    #連接超時  
  6.  
  7.     fastcgi_send_timeout 10;       #寫超時  
  8.  
  9.     fastcgi_read_timeout 10;        #讀取超時  
  10.  
  11.    
  12.  
  13.     #Proxy: (針對proxy/upstreams的生效)  
  14.  
  15.     proxy_connect_timeout 15s;    #連接超時  
  16.  
  17.     proxy_read_timeout 24s;          #讀超時  
  18.  
  19.     proxy_send_timeout 10s;         #寫超時  
  20.  

說明:

Nginx 的超時設置倒是非常清晰容易理解,上面超時針對不同工作模式,但是因為超時帶來的問題是非常多的。

延伸閱讀:

http://hi.baidu.com/pibuchou/blog/item/a1e330dd71fb8a5995ee3753.html

http://hi.baidu.com/pibuchou/blog/item/7cbccff0a3b77dc60b46e024.html

http://hi.baidu.com/pibuchou/blog/item/10a549818f7e4c9df703a626.html

http://www.apoyl.com/?p=466

1

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved