PHP逾時處理全面總結(1)_PHP教程

來源:互聯網
上載者:User
【 概述 】

在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. ScriptAlias /fcgi-bin/ "/home/forum/apache/apache_php/cgi-bin/"
  4. AddHandler php-fastcgi .php
  5. Action php-fastcgi /fcgi-bin/php-cgi
  6. AddType application/x-httpd-php .php
  7. IfModule>

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

 
  1. <IfModule mod_fastcgi.c>
  2. FastCgiExternalServer /home/forum/apache/apache_php/cgi-bin/php-cgi -socket /home/forum/php5/etc/php-fpm.sock -idle-timeout 100
  3. ScriptAlias /fcgi-bin/ "/home/forum/apache/apache_php/cgi-bin/"
  4. AddHandler php-fastcgi .php
  5. Action php-fastcgi /fcgi-bin/php-cgi
  6. AddType application/x-httpd-php .php
  7. 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. [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. MaxProcessCount 最大進程個數
  4. DefaultMinClassProcessCount 每個程式啟動的最小進程個數
  5. DefaultMaxClassProcessCount 每個程式啟動的最大進程個數
  6. IPCConnectTimeout 程式響應逾時時間
  7. IPCCommTimeout 與程式通訊的最長時間,上面的錯誤有可能就是這個值設定過小造成的
  8. MaxRequestsPerProcess 每個進程最多完成處理個數,達成後自殺

[ Lighttpd ]

配置:lighttpd.conf

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

主要涉及選項:

 
  1. server.max-keep-alive-idle = 5
  2. server.max-read-idle = 60
  3. server.read-timeout = 0
  4. server.max-connection-idle = 360
 
  1. --------------------------------------------------
  2. # 每次keep-alive 的最大請求數, 預設值是16
  3. server.max-keep-alive-requests = 100
  4. # keep-alive的最長等待時間, 單位是秒,預設值是5
  5. server.max-keep-alive-idle = 1200
  6. # lighttpd的work子進程數,預設值是0,單進程運行
  7. server.max-worker = 2
  8. # 限制使用者在發送請求的過程中,最大的中間停頓時間(單位是秒),
  9. # 如果使用者在發送請求的過程中(沒發完請求),中間停頓的時間太長,lighttpd會主動中斷連線
  10. # 預設值是60(秒)
  11. server.max-read-idle = 1200
  12. # 限制使用者在接收應答的過程中,最大的中間停頓時間(單位是秒),
  13. # 如果使用者在接收應答的過程中(沒接完),中間停頓的時間太長,lighttpd會主動中斷連線
  14. # 預設值是360(秒)
  15. server.max-write-idle = 12000
  16. # 讀用戶端請求的逾時限制,單位是秒, 配為0表示不作限制
  17. # 設定小於max-read-idle時,read-timeout生效
  18. server.read-timeout = 0
  19. # 寫應答頁面給用戶端的逾時限制,單位是秒,配為0表示不作限制
  20. # 設定小於max-write-idle時,write-timeout生效
  21. server.write-timeout = 0
  22. # 請求的處理時間上限,如果用了mod_proxy_core,那就是和後端的互動時間限制, 單位是秒
  23. server.max-connection-idle = 1200
  24. --------------------------------------------------

說明:

對於一個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. #Fastcgi: (針對後端的fastcgi 生效, fastcgi 不屬於proxy模式)
  3. fastcgi_connect_timeout 5; #連線逾時
  4. fastcgi_send_timeout 10; #寫逾時
  5. fastcgi_read_timeout 10; #讀取逾時
  6. #Proxy: (針對proxy/upstreams的生效)
  7. proxy_connect_timeout 15s; #連線逾時
  8. proxy_read_timeout 24s; #讀逾時
  9. proxy_send_timeout 10s; #寫逾時
  10. }

說明:

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

http://www.bkjia.com/PHPjc/445662.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/445662.htmlTechArticle【 概述 】 在PHP開發中工作裡非常多使用到逾時處理到逾時的場合,我說幾個情境: 1. 非同步擷取資料如果某個後端資料來源擷取不成功則跳過...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.