【 概述 】
在PHP開發(fā)中工作里非常多使用到超時(shí)處理到超時(shí)的場(chǎng)合,我說幾個(gè)場(chǎng)景:
1. 異步獲取數(shù)據(jù)如果某個(gè)后端數(shù)據(jù)源獲取不成功則跳過,不影響整個(gè)頁面展現(xiàn)
2. 為了保證Web服務(wù)器不會(huì)因?yàn)楫?dāng)個(gè)頁面處理性能差而導(dǎo)致無法訪問其他頁面,則會(huì)對(duì)某些頁面操作設(shè)置
3. 對(duì)于某些上傳或者不確定處理時(shí)間的場(chǎng)合,則需要對(duì)整個(gè)流程中所有超時(shí)設(shè)置為無限,否則任何一個(gè)環(huán)節(jié)設(shè)置不當(dāng),都會(huì)導(dǎo)致莫名執(zhí)行中斷
4. 多個(gè)后端模塊(html' target='_blank'>MySQL、Memcached、HTTP接口),為了防止單個(gè)接口性能太差,導(dǎo)致整個(gè)前面獲取數(shù)據(jù)太緩慢,影響頁面打開速度,引起雪崩
5. 。。。很多需要超時(shí)的場(chǎng)合
這些地方都需要考慮超時(shí)的設(shè)定,但是PHP中的超時(shí)都是分門別類,各個(gè)處理方式和策略都不同,為了系統(tǒng)的描述,我總結(jié)了PHP中常用的超時(shí)處理的總結(jié)。
【W(wǎng)eb服務(wù)器超時(shí)處理】
[ Apache ]
一般在性能很高的情況下,缺省所有超時(shí)配置都是30秒,但是在上傳文件,或者網(wǎng)絡(luò)速度很慢的情況下,那么可能觸發(fā)超時(shí)操作。
目前 apache fastcgi php-fpm 模式 下有三個(gè)超時(shí)設(shè)置:
fastcgi 超時(shí)設(shè)置:
修改 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>
如果超時(shí)會(huì)返回500錯(cuò)誤,斷開跟后端php服務(wù)的連接,同時(shí)記錄一條apache錯(cuò)誤日志:
[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 配置參數(shù)說明:
IdleTimeout 發(fā)呆時(shí)限
ProcessLifeTime 一個(gè)進(jìn)程的最長(zhǎng)生命周期,過期之后無條件kill
MaxProcessCount 最大進(jìn)程個(gè)數(shù)
DefaultMinClassProcessCount 每個(gè)程序啟動(dòng)的最小進(jìn)程個(gè)數(shù)
DefaultMaxClassProcessCount 每個(gè)程序啟動(dòng)的最大進(jìn)程個(gè)數(shù)
IPCConnectTimeout 程序響應(yīng)超時(shí)時(shí)間
IPCCommTimeout 與程序通訊的最長(zhǎng)時(shí)間,上面的錯(cuò)誤有可能就是這個(gè)值設(shè)置過小造成的
MaxRequestsPerProcess 每個(gè)進(jìn)程最多完成處理個(gè)數(shù),達(dá)成后自殺
[ Lighttpd ]
配置:lighttpd.conf
Lighttpd配置中,關(guān)于超時(shí)的參數(shù)有如下幾個(gè)(篇幅考慮,只寫讀超時(shí),寫超時(shí)參數(shù)同理):
主要涉及選項(xiàng):
server.max-keep-alive-idle = 5
server.max-read-idle = 60
server.read-timeout = 0
server.max-connection-idle = 360
--------------------------------------------------
# 每次keep-alive 的最大請(qǐng)求數(shù), 默認(rèn)值是16
server.max-keep-alive-requests = 100
# keep-alive的最長(zhǎng)等待時(shí)間, 單位是秒,默認(rèn)值是5
server.max-keep-alive-idle = 1200
# lighttpd的work子進(jìn)程數(shù),默認(rèn)值是0,單進(jìn)程運(yùn)行
server.max-worker = 2
# 限制用戶在發(fā)送請(qǐng)求的過程中,最大的中間停頓時(shí)間(單位是秒),
# 如果用戶在發(fā)送請(qǐng)求的過程中(沒發(fā)完請(qǐng)求),中間停頓的時(shí)間太長(zhǎng),lighttpd會(huì)主動(dòng)斷開連接
# 默認(rèn)值是60(秒)
server.max-read-idle = 1200
# 限制用戶在接收應(yīng)答的過程中,最大的中間停頓時(shí)間(單位是秒),
# 如果用戶在接收應(yīng)答的過程中(沒接完),中間停頓的時(shí)間太長(zhǎng),lighttpd會(huì)主動(dòng)斷開連接
# 默認(rèn)值是360(秒)
server.max-write-idle = 12000
# 讀客戶端請(qǐng)求的超時(shí)限制,單位是秒, 配為0表示不作限制
# 設(shè)置小于max-read-idle時(shí),read-timeout生效
server.read-timeout = 0
# 寫應(yīng)答頁面給客戶端的超時(shí)限制,單位是秒,配為0表示不作限制
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選