php方法執行時間過長的解決方法:1、進行Nginx網關請求逾時設定;2、進行PHP腳本執行時間上限設定。
本文操作環境:windows7系統、PHP7.1版,DELL G3電腦
如何解決php方法執行時間過長的問題?
解決PHP 方法執行時間過長導致502 Bad Gateway
#背景
最近遇到一個問題,有一段PHP 程式碼需要涉及長時間的IO 操作,而這段會阻塞請求所在的線程,導致請求逾時。
你可能會說,這有啥難的,開個線程異步去做,做好了更新狀態就 OK 了。這真是個不錯的方案,可惜這一整套程式碼都是別人的。如果要修改程式碼,業務上會牽一發而動全身,所以我的解決方法是盡量不修改程式碼的情況下,透過設定超時時間來解決這個問題。
解決方案
從上述問題來看,逾時主要受到兩個因素的影響:
Nginx 閘道請求逾時設定
PHP 腳本執行時間上限設定
#我們依序設定。
Nginx 閘道請求逾時設定
Nginx 支援逾時的設定粒度很細。主要使用的幾個如下:
keepalive_timeout
Nginx 使用 keepalive_timeout 來指定 KeepAlive 的逾時時間。指定每個 TCP 連線最多可以保持多長時間。 Nginx 的預設值是 75 秒,有些瀏覽器只保持長達 60 秒,所以可以設定為 60 秒。
fastcgi_connect_timeout
與FastCGI伺服器建立連線的逾時。
fastcgi_send_timeout
設定將請求傳送到FastCGI伺服器的逾時。僅在兩次連續寫入操作之間設定逾時,而不是為整個請求的傳輸。如果FastCGI伺服器在此時間內未收到任何內容,則關閉連線。
fastcgi_read_timeout
從FastCGI伺服器讀取回應的逾時。僅在兩個連續的讀取操作之間設定逾時,而不是為整個回應的傳輸。如果FastCGI伺服器在此時間內未傳輸任何內容,則關閉連線。
考慮到一次請求 PHP 腳本的執行和後三個設定比較相關。所以在對應網站的 Nginx 設定檔中加入設定即可。
fastcgi_connect_timeout 600s; fastcgi_send_timeout 600s; fastcgi_read_timeout 600s;
PHP 腳本執行時間上限設定
PHP 腳本的執行時間主要是受兩個設定的影響:
php.ini 中 max_execution_time 和 max_input_time
php.ini 的預設位置在/usr/local/php/etc/
將php.ini 設定檔中的這兩個設定項修改為逾時時間上限。
max_execution_time = 600 max_input_time = 600 php-fpm.conf 中 request_terminate_timeout php-fpm.conf 的默认位置在 /usr/local/php/etc/ request_terminate_timeout 也设置为超时时间的上限。 request_terminate_timeout = 600
修改完成後重新啟動 Nginx 和 php-fpm 即可。
service nginx reload /etc/init.d/php-fpm reload
推薦學習:《PHP影片教學》
以上是如何解決php方法執行時間過長的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!