このすみノート

Webエンジニアが技術や趣味を書くブログです。

PHPのmax_execution_timeにsleepは含まれない

業務で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関数は実行時間には含まれないようです。 要は眠っているだけで何も実行してないから、実行時間ではないという結論です。

salumarine.com

まとめ

  • PHPのタイムアウト制御(max_execution_time)だけでは不十分です。
  • php-fpmのfastcgi_connect_timeout,fastcgi_send_timeout,fastcgi_read_timeout
  • nginxのsend_timeoutなどを組み合わせて実現するのが、やはり現実的かと思った次第です。