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