首頁  >  文章  >  後端開發  >  如何解決php方法執行時間過長的問題

如何解決php方法執行時間過長的問題

藏色散人
藏色散人原創
2021-07-23 10:51:324985瀏覽

php方法執行時間過長的解決方法:1、進行Nginx網關請求逾時設定;2、進行PHP腳本執行時間上限設定。

如何解決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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn