PHP開発では、 ini_set( 'max_execution_time'、0)は、スクリプト実行時間を設定するために使用される一般的な命令です。その目的は、スクリプトを時間制限なしで実行することを許可し、通常、データのインポート、大規模なデータ処理などの長期にわたるタスクを実行するために使用されることです。ただし、多くの開発者は、この問題に遭遇します。なぜこれが起こるのですか?
まず、 max_execution_timeの役割を理解する必要があります。この構成アイテムは、PHPスクリプトの最大実行時間(単位:秒)を設定するために使用されます。デフォルトでは、PHPはスクリプトの最大実行時間を制限して、無制限の実行によりサーバーリソースが過度に消費またはクラッシュすることを避けます。スクリプトがこの時間制限を超えると、タイムアウトエラーがスローされ、実行が停止します。
たとえば、 ini_set( 'max_execution_time'、0)は最大実行時間を0に設定します。つまり、スクリプトには時間制限がなく、無期限に実行できます。
ini_set( 'max_execution_time'、0)は、理論的にPHPスクリプトを無制限に実行できるようにする必要がありますが、場合によっては有効にならない場合があります。一般的な理由は次のとおりです。
ApacheやNginxなどの多くのWebサーバーも、構成ファイルのタイムアウト制限を設定しています。 Apacheの場合、通常はタイムアウト命令ですが、nginxはproxy_read_timeout 、 fastcgi_read_timeoutなどの設定を持っています。これらのサーバーレベルのタイムアウト設定がPHPでmax_execution_timeよりも厳しい場合、PHP構成は有効ではありません。したがって、PHPが無制限の実行時間を設定したとしても、Webサーバーのタイムアウト制限は依然としてスクリプトの中断を引き起こします。
回避策:Webサーバーの構成を確認して、タイムアウトが十分に長く設定されていることを確認するか、タイムアウト制限を無効にします。
コマンドラインインターフェイス(CLI)でPHPスクリプトを実行している場合、 ini_set( 'max_execution_time'、0)は通常有効になります。これは、CLIのタイムアウト制限が通常Web環境ほど厳格ではないためです。ただし、Web環境では、 MAX_EXECUTION_TIMEの設定がWebサーバーの構成の影響を受ける可能性があります。
回避策:Web環境でテストし、サーバーのタイムアウト設定を無効にできない場合は、スクリプトをコマンドライン環境に移動して実行するか、サーバー設定を調整してみてください。
一部のPHP実行モード(FPMモードなど)は、構成動作が異なる場合があります。場合によっては、FPMに独自のタイムアウト構成がある可能性があるため、 MAX_EXECUTION_TIME設定は予想どおりに機能しない場合があります。 PHP内の実行時間設定でスクリプトが無制限であっても、FPMまたはFASTCGIのタイムアウト設定により、PHPリクエストの最大実行時間が制限される場合があります。
回避策:PHP-FPMまたはFASTCGIの構成ファイルをチェックして、時間制限がないか、タイムアウト制限が長いことを確認します。
PHPのset_time_limit()関数は、スクリプトの最大実行時間を制御する関数でもあります。 ini_set( 'max_execution_time'、0)と同様に、スクリプトの実行時間を設定するためにも使用されます。ただし、 set_time_limit()は動的にアクティブであり、実行されるたびにスクリプトの最大実行時間をリセットすることに注意する必要があります。 set_time_limit()呼び出しがスクリプトに存在する場合、 ini_setで設定したmax_execution_timeを上書きする場合があります。
解決策: set_time_limit()関数がコードで呼び出されるかどうかを確認して、 max_execution_timeの設定に影響しないことを確認します。
ini_set()を使用してスクリプトでmax_execution_timeを設定することに加えて、この値がphpのphp.ini構成ファイルに設定されており、値が変更できないように設定されている可能性があります。一部の共有ホスティングまたは制限されたサーバー環境では、 PHP.iniファイルのMAX_EXECUTION_TIMEが固定値に設定されている可能性があり、通常、値をini_set()で変更することはできません。
回避策:可能であれば、 php.iniファイルのmax_execution_time構成アイテムを確認して変更するか、サーバー管理者に連絡してこの設定を調整します。
一部のPHPフレームワークまたはサードパーティのコードベースには、実行時間に追加の制限があるか、バックグラウンドのタイムアウトを制限するSET_TIME_LIMIT()またはその他の関数を呼び出す場合があります。この場合、コードでmax_execution_timeを設定したとしても、フレームワークまたはライブラリはこの設定をオーバーライドする場合があります。
回避策:使用しているフレームワークまたはライブラリのドキュメントを確認して、実行時間制限があるかどうかを確認し、これらの制限を適切に調整またはバイパスします。
ini_set( 'max_execution_time'、0)を使用すると、phpスクリプトを制限なしに実行できますが、場合によっては無効である可能性があります。一般的な理由には、Webサーバー上の構成制限、PHPの動作モード、他の機能への干渉、PHP構成ファイルの制限、および使用されるフレームワークまたはライブラリの制限が含まれます。この問題は通常、これらの要因を調べて調整することで解決できます。