最近發(fā)現(xiàn)服務(wù)器經(jīng)??ㄋ?,經(jīng)過(guò)檢查是因?yàn)樵L問(wèn)量過(guò)大,導(dǎo)致PHP服務(wù)器卡死,原因可能是php-cgi.exe進(jìn)程過(guò)多。
以下是關(guān)于PHP服務(wù)器卡死因?yàn)閜hp-cgi.exe進(jìn)程過(guò)多解決參考:
1.檢查系統(tǒng)盤空間。查看系統(tǒng)臨時(shí)文件是否過(guò)多,mysql數(shù)據(jù)庫(kù)的臨時(shí)文件默認(rèn)存到了c:/windows/temp,導(dǎo)致累積了幾萬(wàn)甚至上百萬(wàn)的小文件,壓垮系統(tǒng)盤。
del *.* 刪除所有文件
2.PHP是一種廣泛使用的動(dòng)態(tài)腳本語(yǔ)言,不過(guò)在IIS中并沒(méi)有內(nèi)置對(duì)PHP語(yǔ)言的支持,因此如果需要使用PHP,必須自行安裝。PHP可以安裝為CGI模式或者ISAPI模式,由于ISAPI模式具有更高的性能,因此我建議大家使用ISAPI模式。
3.如能修改程序,建議將程序配置文件中的StartProcesses值縮到2,看是否改善。
4.看是否服務(wù)器有問(wèn)題攻擊現(xiàn)象。
windows 2003+IIS6中優(yōu)化fastcgi配置文件fcgiext.ini,減少php-cgi.exe進(jìn)程數(shù)量和所占內(nèi)存大小
本來(lái)聽(tīng)說(shuō)fastcgi比isapi好就在服務(wù)器中裝上了,配置環(huán)境為windows 2003+IIS6+fastcgi(FCGI)+PHP5.2.17,經(jīng)過(guò)與很長(zhǎng)一段時(shí)間觀察,發(fā)現(xiàn)工作在FastCGI模式下的PHP會(huì)占用越來(lái)越多的內(nèi)存,訪問(wèn)量稍微多點(diǎn)php-cgi進(jìn)程就多了N個(gè),同樣情況下能比原來(lái)用isapi模式的時(shí)候多出幾百M(fèi),我的服務(wù)器內(nèi)存只有2G傷不起啊。
我在網(wǎng)上搜索了一下,發(fā)現(xiàn)還有不少人面臨同樣的問(wèn)題。來(lái)自PHP官方的一個(gè)比較正式的解釋是:php-cgi進(jìn)程并沒(méi)有內(nèi)存泄漏,php-cgi會(huì)在每個(gè)請(qǐng)求結(jié)束的時(shí)候回收腳本使用的全部?jī)?nèi)存,但是并不會(huì)釋放給操作系統(tǒng),而是繼續(xù)持有以應(yīng)對(duì)下一次PHP請(qǐng)求。這樣做大概是為了減少內(nèi)存碎片化或者解決從系統(tǒng)申請(qǐng)內(nèi)存之后又釋放回操作系統(tǒng)所需要的時(shí)間不可控問(wèn)題。可是如果偶然一次PHP請(qǐng)求使用了諸如ftp或者zlib這樣的大內(nèi)存操作,那么將導(dǎo)致一大塊系統(tǒng)內(nèi)存被php-cgi持續(xù)占有,不能被利用。
解決這個(gè)問(wèn)題的辦法是在web服務(wù)器配置中優(yōu)化fastcgi配置文件參數(shù)。
在C:WINDOWSsystem32inetsrvfcgiext.ini 文件中可以設(shè)定php-cgi進(jìn)程相關(guān)參數(shù),如:
[Types]
php = PHP
[PHP]
ExePath=C:php-5.3.8-nts-Win32-VC9-x86php-cgi.exe
maxInstances=100
InstanceMaxRequests=10000
EnvironmentVars=PHP_FCGI_MAX_REQUESTS:10000
RequestTimeout=600
ActivityTimeout=900
在上面的配置中:
ExePath 指定了FastCGI解析程序的路徑,
instanceMaxRequests 指定了每個(gè)實(shí)例可以處理的最大請(qǐng)求數(shù),
maxInstances 指定可以啟動(dòng)的最大實(shí)例數(shù)目,
EnvironmentVars 創(chuàng)建了一個(gè)環(huán)境變量 PHP_FCGI_MAX_REQUESTS ,默認(rèn)值設(shè)為10000,
requestTimeout 指定了請(qǐng)求的超時(shí)時(shí)間為600秒,
activityTimeout 指定了活動(dòng)會(huì)話超時(shí)時(shí)間為900秒。
一下是建議值:
maxInstances=
把這個(gè)值改小
建議
512M 內(nèi)存的改maxInstances=50
1G 內(nèi)存的改maxInstances=80
2G 內(nèi)存的改maxInstances=140
再修改
InstanceMaxRequests=
把這個(gè)值改小
建議
512M 內(nèi)存的改InstanceMaxRequests=200
1G 內(nèi)存的改InstanceMaxRequests=300
2G 內(nèi)存的改InstanceMaxRequests=500
改完, 重啟IIS。
maxInstances 這個(gè)參數(shù)指定可以啟動(dòng)的最大實(shí)例數(shù)目,即php-cgi.exe進(jìn)程的數(shù)目。如果把它降低,
或于還有其它原因,請(qǐng)自行仔細(xì)檢查服務(wù)器,必將能找到相關(guān)的解決方法。