1、場景還原
php程序在執行抓取遠程圖片庫並保存至本地服務器的時候,出現了「504 Gateway Time-out」錯誤提示。php
問題定位:因爲圖片巨多,因此下載時間很長(10分鐘以上),引發網關超時。nginx
2、問題分析
Nginx 504 Gateway Time-out的含義是所請求的網關沒有請求到,簡單來講就是沒有請求到能夠執行的PHP-CGI。數據庫
一般如下幾種狀況會致使這個問題:服務器
1. 程序在處理大量的數據,或者有死循環之類的問題 2. 建立數據庫之類的鏈接由於某些緣由鏈接不上,而後沒有超時失敗的機制,致使一直在建立鏈接 3. 程序中有一些http請求,這些請求執行時間過長,致使超時。
3、解決方法函數
分別修改nginx及php的相關配置參數。url
1.修改Nginx配置( nginx.conf ):spa
fastcgi_connect_timeout 1200s;#原設置爲300s fastcgi_send_timeout 1200s;#原設置爲300s fastcgi_read_timeout 1200s;#原設置爲300s fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k;
這裏最主要的設置是前三條,即.net
fastcgi_connect_timeout #同 FastCGI 服務器的鏈接超時時間,默認值60秒,它不能超過75秒; fastcgi_send_timeout #Nginx 進程向 FastCGI 進程發送 request ,整個過程的超時時間,默認值60秒; fastcgi_read_timeout #FastCGI 進程向 Nginx 進程發送 response ,整個過程的超時時間,默認值60秒;
2. 修改php配置文件code
php.ini max_execution_time = 300s;PHP 腳本的最大執行時間,可是,在 php-cgi(php-fpm) 中,該參數不會起效。 php-fpm request_terminate_timeout = 0; #設置單個請求的超時停止時間.設置爲0 即一直執行下去直到程序結束不會超時。
修改完上述設置以後 再次執行發現沒有出現504超時提示,可是頁面空白,圖片並無下載成功。應該仍是php在執行過程當中超時。查看php代碼,在程序開始處添加如下代碼:blog
set_time_limit(0);
本函數用來配置該頁最久執行時間。默認值是 30 秒,在 php.ini 中的 max_execution_time 變量配置,若配置爲 0 則不限定最久時間。
當執行到該函數時,纔開始計算。例如,若默認是 30 秒,而在執行到該函數前已執行了 25 秒,而用本函數改成 20 秒,則該頁面最長執行時間爲 45 秒。
再次執行,結果能夠了。
做者:哆啦C夢