業務でPHPを使ったWEBアプリケーションのタイムアウト時間の設定を行っているのですが、その中のひとつにPHPのタイムアウト設定があります。
<?php ini_set('max_execution_time', 30);
これを変更して動作試験していたのですが、sleepだとうまくテストできなかったので記します。
max_execution_timeとは
スクリプトが強制終了されるまでに許容される最大時間なのですが、まず説明がおもしろいです。
スクリプトがパーサにより強制終了されるまでに許容される最大の 時間を秒単位で指定します。この命令は、いい加減に書かれた スクリプトがサーバーの負荷を上げることを防止するのに役立ちます。 デフォルトでは、30 に設定されています。 PHP を コマンドライン から実行する場合のデフォルト設定は 0 です。
https://www.php.net/manual/ja/info.configuration.php#ini.max-execution-time より
いい加減に書かれたスクリプトによる負荷上昇を防止するためにある。
sleepだとうまくいかない
たとえば、5秒を設定して100秒スリープさせてみるわけですが、想定通りの強制終了にはありません。
<?php ini_set('max_execution_time', 5); sleep(100);
sleepは実行時間には含まれないらしい
いろいろ調べた結果としての結論は、sleep関数は実行時間には含まれないようです。 要は眠っているだけで何も実行してないから、実行時間ではないという結論です。
まとめ
- PHPのタイムアウト制御(max_execution_time)だけでは不十分です。
- php-fpmのfastcgi_connect_timeout,fastcgi_send_timeout,fastcgi_read_timeout
- nginxのsend_timeoutなどを組み合わせて実現するのが、やはり現実的かと思った次第です。