萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> PHP超時處理應用場合及解決方案全面總結

PHP超時處理應用場合及解決方案全面總結

   【 概述 】

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

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

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

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

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

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

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

  【Web服務器超時處理】

  [ Apache ]

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

  目前apachefastcgiphp-fpm模式下有三個超時設置:

  fastcgi超時設置:

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

代碼如下   <IfModulemod_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/"

AddHandlerphp-fastcgi.php

Actionphp-fastcgi/fcgi-bin/php-cgi

AddTypeapplication/x-httpd-php.php

< /IfModule>

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

代碼如下   <IfModulemod_fastcgi.c>

FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock-idle-timeout100

ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"

AddHandlerphp-fastcgi.php

Actionphp-fastcgi/fcgi-bin/php-cgi

AddTypeapplication/x-httpd-php.php

< /IfModule>

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

代碼如下   [ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:commwithserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"aborted:idletimeout(30sec)

[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:incompleteheaders(0bytes)receivedfromserver"/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
copyright © 萬盛學電腦網 all rights reserved