php メソッドの実行時間が長すぎる問題の解決策: 1. Nginx ゲートウェイのリクエスト タイムアウトを設定する; 2. PHP スクリプトの実行時間の上限を設定する。
この記事の動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 パソコン
php でエラーが発生する問題の解決方法メソッドの実行時間が長すぎますか?
PHP メソッドの実行時間が長すぎることが原因で発生する 502 Bad Gateway の解決策
バックグラウンド
最近問題が発生しました。PHP の一部があります。このコードには長時間の IO 操作が必要であり、この期間はリクエストが存在するスレッドをブロックし、リクエストがタイムアウトする原因となります。
これの何がそんなに難しいの? と思われるかもしれませんが、スレッドを開いて非同期で実行するだけで、ステータスを更新するだけで問題ありません。これは本当に良い解決策ですが、このコード セット全体が他の人のものであるのは残念です。コードを変更したい場合はビジネスに影響を与えるため、私の解決策は、コードをできるだけ変更せずにタイムアウトを設定することでこの問題を解決することです。
解決策
上記の問題から、タイムアウトは主に 2 つの要因の影響を受けます:
Nginx ゲートウェイ リクエストのタイムアウト設定
PHPスクリプト実行時間上限設定
順番に設定していきます。
Nginx ゲートウェイ リクエスト タイムアウト設定
Nginx は、非常に詳細なタイムアウト設定をサポートしています。主に使用されるものは次のとおりです。
keepalive_timeout
Nginx は KeepAlive_timeout を使用して KeepAlive のタイムアウトを指定します。各 TCP 接続を維持できる最大時間を指定します。 Nginx のデフォルト値は 75 秒ですが、ブラウザによっては最大 60 秒しか維持しないため、60 秒に設定できます。
fastcgi_connect_timeout
FastCGI サーバーとの接続を確立するためのタイムアウト。
fastcgi_send_timeout
FastCGI サーバーにリクエストを送信するときのタイムアウトを設定します。タイムアウトは、要求された転送全体ではなく、連続する 2 つの書き込み操作の間にのみ設定します。 FastCGI サーバーがこの時間内に何も受信しない場合、接続は閉じられます。
fastcgi_read_timeout
FastCGI サーバーからの応答の読み取りのタイムアウト。タイムアウトは、応答全体の転送ではなく、連続する 2 つの読み取り操作の間にのみ設定してください。 FastCGI サーバーがこの時間内に何も送信しない場合、接続は閉じられます。
PHP スクリプトの実行は、最後の 3 つの設定とより関連していると考えます。したがって、対応する Web サイトの Nginx 構成ファイルに設定を追加するだけです。
fastcgi_connect_timeout 600s; fastcgi_send_timeout 600s; fastcgi_read_timeout 600s;
PHP スクリプトの実行時間の上限設定
PHP スクリプトの実行時間は、主に 2 つの設定によって影響を受けます:
php.ini 中 max_execution_time 和 max_input_time
php.iniデフォルトの場所は /usr/local/php/etc/
php.ini 設定ファイル内のこれら 2 つの設定項目をタイムアウト期間の上限に変更します。
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 中国語 Web サイトの他の関連記事を参照してください。