現在の位置: ホーム> 最新記事一覧> [set_time_limit関数を呼び出した後も、スクリプトはまだタイムアウトしています。一般的な理由と解決策は何ですか?

[set_time_limit関数を呼び出した後も、スクリプトはまだタイムアウトしています。一般的な理由と解決策は何ですか?

gitbox 2025-06-22

1。MAX_EXECUTION_TIME設定PHP構成ファイル

PHPのMAX_EXECUTION_TIME構成項目は、スクリプトの最大実行時間を制御します。スクリプトでset_time_limitを呼び出す場合でも、構成アイテムがphp.iniファイルで低い値を設定する場合、スクリプトの実行時間を制限します。 set_time_limitへの呼び出しは、現在のスクリプトの最大実行時間を一時的に変更しますが、 php.inimax_execution_time値が必要な実行時間よりも低い場合、スクリプトはまだ終了します。

解決:

php.iniでmax_execution_time設定を確認して変更します。スクリプトを長く実行したい場合は、その価値を上げることができます。次のコマンドを使用して、現在のMAX_EXECUTION_TIME構成を見つけることができます。

 <span><span><span class="hljs-title function_ invoke__">phpinfo</span></span><span>();
</span></span>

次に、 php.iniファイルの対応する構成を変更します。

 <span><span><span class="hljs-attr">max_execution_time</span></span><span> = </span><span><span class="hljs-number">300</span></span><span>  </span><span><span class="hljs-comment">; ASを設定します3002番(5分)</span></span><span>
</span></span>

変更後、構成を有効にするには、Webサーバー(ApacheやNginxなど)を再起動する必要があります。


2。Webサーバーのタイムアウト設定

PHP構成に加えて、Webサーバー(Apache、Nginxなど)もリクエストタイムアウト制限を設定する場合があり、スクリプト実行タイムアウトも引き起こします。たとえば、ApacheのTimeoutディレクティブまたはNginxのProxy_Read_Timeout設定では、PHPスクリプトの実行時間が制限される場合があります。

解決:

使用しているWebサーバーに従って、関連するタイムアウト設定を確認して調整します。

  • Apacheタイムアウト構成アイテムを見つけて変更します。

 <span>Timeout 300
</span>
  • nginxproxy_read_timeoutまたはfastcgi_read_timeoutの設定をnginx.confファイルの追加または変更:

 <span><span><span class="hljs-attribute">proxy_read_timeout</span></span><span> </span><span><span class="hljs-number">300</span></span><span>;
</span><span><span class="hljs-attribute">fastcgi_read_timeout</span></span><span> </span><span><span class="hljs-number">300</span></span><span>;
</span></span>

変更後、サーバーを再起動して設定を有効にします。


3。スクリプト内の長期ブロッキング操作

一部のPHPスクリプトは、データベースクエリ、リモートAPIリクエストなど、特定の操作中に長時間ブロックする場合があります。Set_time_limit最大実行時間を変更しても、これらの操作自体のブロックがスクリプト実行タイムアウトを引き起こす可能性があります。

解決:

  • データベースクエリを最適化して、合理的な時間内に完了し、不必要なロックを避けます。

  • 非同期リクエストまたはバッチ処理を使用して、長期的な閉塞を回避します。たとえば、APIリクエストまたはデータベースクエリは、要求ごとに処理時間が短く、複数の小さなリクエストに分割される場合があります。


4。マルチスレッドまたは同時リクエストの間の干渉

PHPスクリプトに同時リクエストまたは複数のスレッドを含む操作がある場合、複数のタスクを処理するときに単一のスレッドの時間制限を超える場合があります。 set_time_limitは単一のプロセスの実行時間を調整できますが、並行性では、複数のプロセスのタイムアウト設定を同期的に調整する必要があります。

解決:

同時タスクを処理するために、キューシステム(Rabbitmq、Redisなど)を使用することを検討してください。タスクを複数の小さなサブタスクに分割し、非同期に処理することにより、単一のプロセスタイムアウトが回避されます。


5。Set_time_limitアクションの範囲

set_time_limitは現在のスクリプトに対してのみ有効であり、外部リクエストまたはPHPの他のスクリプトのタイムアウト制限には影響しません。スクリプトに内部にファイルが含まれる要求されている場合、 set_time_limitはこれらのファイルのコード実行時間を拡張できない場合があります。

解決:

set_time_limitがスクリプトの先頭に呼び出されるか、 set_time_limitが含まれるすべてのファイルで呼び出されることを確認してください。すべてのファイルを影響を受ける場合は、エントリファイル(index.phpなど)でset_time_limitを呼び出すことを検討してください。


6。システムレベルのリソースの制限

一部の環境(共有ホスティングや一部のクラウドサービスプロバイダーなど)では、PHPスクリプトの実行時間は、PHP構成によって必ずしも変更されるとは限らないオペレーティングシステムレベルの制限の対象となる場合があります。たとえば、一部のオペレーティングシステムまたはコンテナ化された環境は、リソースの使用が高すぎる場合にスクリプトを終了する場合があります。

解決:

Ulimitコマンドなどのサーバーのオペレーティングシステムレベルの制限を確認して、システムがプロセスの実行時間を制限しないことを確認します。変更できない場合は、スタンドアロンサーバーや専用のクラウドホストなど、よりリソースのない環境に移行することを検討してください。


7。その他のサードパーティの制限

一部のサードパーティサービスまたはコンポーネントは、特に外部APIまたは統合サービスを使用する場合、スクリプトの実行時間を制限する場合があります。たとえば、一部のAPIは、リクエストがタイムアウトした後にエラーを返す場合があり、スクリプトが終了します。

解決:

  • サードパーティサービスのドキュメントを確認して、タイムアウト設定があるかどうかを確認してください。

  • スクリプトで適切なエラー処理メカニズムを使用して、タイムアウトの例外をキャッチおよび処理します。