在一次接口測試中,發(fā)現(xiàn)返回的http 504 time out 的錯(cuò)誤,然后查看了php-fpm的錯(cuò)誤日志,發(fā)現(xiàn)了如下錯(cuò)誤
創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設(shè)|企業(yè)網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋成都自上料攪拌車等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身策劃品質(zhì)網(wǎng)站。
從表現(xiàn)上看,是php進(jìn)程超時(shí)導(dǎo)致的進(jìn)程被kill了,那么這個(gè)超時(shí)時(shí)間以及kill的機(jī)制是跟哪些參數(shù)有關(guān)呢,這里系統(tǒng)這里一下。
Nginx服務(wù)一般因?yàn)閜hp的錯(cuò)誤或者超時(shí)會有兩種錯(cuò)誤碼502 bad Gateway 或者 504 Gateway Time-out
一種情況是php產(chǎn)生了語法錯(cuò)誤,比如循環(huán)調(diào)用、變量作用域錯(cuò)誤、方法不存在等,如果開啟錯(cuò)誤日志輸出的話,這種錯(cuò)誤在php-fpm的錯(cuò)誤日志中是可以看到調(diào)用棧信息的。
另外一種情況可能就是超時(shí)引起的php-fpm主動(dòng)kill的情況,在php.ini和php.fpm中有兩個(gè)配置項(xiàng),用來管理php腳本的最大執(zhí)行時(shí)間
當(dāng)php腳本的執(zhí)行時(shí)間超過這個(gè)時(shí)間時(shí),PHP-FPM不只會終止腳本的執(zhí)行,還會終止執(zhí)行腳本的Worker進(jìn)程。所以Nginx會發(fā)現(xiàn)與自己通信的連接斷掉了,就會返回給客戶端502錯(cuò)誤。
以頂部的錯(cuò)誤為例,當(dāng)報(bào)502錯(cuò)誤是,nginx的errorlog中有如下日志,:
所以只需將這兩項(xiàng)的值調(diào)大一些就可以讓PHP腳本不會因?yàn)閳?zhí)行時(shí)間長而被終止了。request_terminate_timeout可以覆蓋max_execution_time,
所以如果不想改全局的php.ini,那只改PHP-FPM的配置就可以了。
此外要注意的是Nginx的upstream模塊中的max_fail和fail_timeout兩項(xiàng)。這兩個(gè)配置表示在fail_timeout事件內(nèi),如果fail的測試達(dá)到max_fail,那么在接下來的fail_timeout時(shí)間內(nèi),Nginx都會認(rèn)為上游服務(wù)器掛掉了,都會返回502錯(cuò)誤。
所以可以將max_fail調(diào)大一些,將fail_timeout調(diào)小一些。
PHP-FPM設(shè)置的腳本最大執(zhí)行時(shí)間已經(jīng)夠長了,但執(zhí)行耗時(shí)PHP腳本時(shí),發(fā)現(xiàn)Nginx報(bào)錯(cuò)從502變?yōu)?04了。這是為什么呢?
因?yàn)槲覀冃薷牡闹皇荘HP的配置,Nginx中也有關(guān)于與上游服務(wù)器通信超時(shí)時(shí)間的配置
以Nginx超時(shí)時(shí)間為90秒,PHP-FPM超時(shí)時(shí)間為300秒為例,報(bào)504 Gateway Timeout錯(cuò)誤時(shí)的Nginx錯(cuò)誤訪問日志如下:
調(diào)高這三項(xiàng)的值(主要是read和send兩項(xiàng),默認(rèn)不配置的話Nginx會將超時(shí)時(shí)間設(shè)為60秒)之后,504錯(cuò)誤也解決了。
而且這三項(xiàng)配置可以配置在http、server級別,也可以配置在location級別。擔(dān)心影響其他應(yīng)用的話,就配置在自己應(yīng)用的location中吧。
要注意的是factcgi_connect/read/send_timeout是對FastCGI生效的,而proxy_connect/read/send_timeout是對proxy_pass生效的。
參考鏈接: 感謝分享!
這里就簡單介紹兩種:
一、增加超時(shí)的時(shí)間限制
這里需要注意:set_time_limit只是設(shè)置你的PHP程序的超時(shí)時(shí)間,而不是file_get_contents函數(shù)讀取URL的超時(shí)時(shí)間。
我一開始以為set_time_limit也能影響到file_get_contents,后來經(jīng)測試,是無效的。真正的修改file_get_contents延時(shí)可以用resource
$context的timeout參數(shù):
復(fù)制代碼
代碼如下:
$opts
=
array(
‘http'=array(
‘method'=”GET”,
‘timeout'=60,
)
);
$context
=
stream_context_create($opts);
$html
=file_get_contents('',
false,
$context);
fpassthru($fp);
二、一次有延時(shí)的話那就多試幾次
有時(shí)候失敗是因?yàn)榫W(wǎng)絡(luò)等因素造成,沒有解決辦法,但是可以修改程序,失敗時(shí)重試幾次,仍然失敗就放棄,因?yàn)閒ile_get_contents()如果失敗將返回
FALSE,所以可以下面這樣編寫代碼:
復(fù)制代碼
代碼如下:
$cnt=0;
while($cnt
3
($str=@file_get_contents('http…'))===FALSE)
$cnt++;
set_time_limit(0);
這個(gè)是不限制上傳文件的時(shí)間,寫到頁面就可以
進(jìn)入php源程序目錄中的ext目錄中,這里存放著各個(gè)擴(kuò)展模塊的源代碼,選擇你需要的模塊,比如curl模塊:cd curl
執(zhí)行phpize生成編譯文件,phpize在PHP安裝目錄的bin目錄下
/usr/local/php5/bin/phpize
運(yùn)行時(shí),可能會報(bào)錯(cuò):Cannot find autoconf. Please check your autoconf installation and
the $PHP_AUTOCONF
environment variable is set correctly and then rerun this
script.,需要安裝autoconf:
yum install autoconf(RedHat或者CentOS)、apt-get install
autoconf(Ubuntu Linux)
/usr/local/php5/bin/php -v
執(zhí)行這個(gè)命令時(shí),php會去檢查配置文件是否正確,如果有配置錯(cuò)誤,
這里會報(bào)錯(cuò),可以根據(jù)錯(cuò)誤信息去排查!
php處理數(shù)據(jù)時(shí)會有一個(gè)等待時(shí)間,就是所說的超時(shí)時(shí)間,而且如果使用mysql的話,它也有一個(gè)超時(shí)時(shí)間,運(yùn)行一串代碼時(shí)間如果超過配置文件的時(shí)間,會被中斷不運(yùn)行。第一種你可以修改php配置文件timeout的運(yùn)行時(shí)間,第二你可以分批處理大量數(shù)據(jù),注意是分批處理,就OK了。
好像默認(rèn)的是每個(gè)頁面中腳本的執(zhí)行時(shí)間最大30秒,估計(jì)你在腳本運(yùn)行抓取這10頁面時(shí)超過了30秒,所以就會報(bào)超時(shí)!
你可以在腳本前面加一句 ini_set('max_execution_time', '0');
把腳本最大執(zhí)行時(shí)間設(shè)置為0,這樣就是無時(shí)間限制,直到腳本執(zhí)行完成!
網(wǎng)站標(biāo)題:php加載數(shù)據(jù)超時(shí),php 超時(shí)
文章來源:http://sd-ha.com/article48/phhiep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計(jì)、、App設(shè)計(jì)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)