ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PHP:実行時間の制限を確実に回避できるのは?

PHPの実行時間の制限について書きました。
ajya.hatenablog.jp

max_execution_timeの値を長い時間をにして止まらないのを確認するのも方法ですが、1秒という極端に短い時間にして試してみました。
確かに1秒で終了したので、max_execution_timeの値で制限ができるようです。

どっちを使う?

max_execution_timeの説明には、「より詳細な情報については、 set_time_limit() 関数の説明を参照ください。」とあるので、set_time_limit()の説明を見てみました。
PHP: set_time_limit - Manual

こちらを使えば、max_execution_timeの値を設定するのと同じように、実行時間の制限ができることが分かりました。
実際1秒と設定してためしたら、1秒で終了しました。

興味深かったのは、User Contributed Notesのこちらのコードです。
PHP: set_time_limit - Manual

ループの外側で1度だけset_time_limit(1)を呼び出した場合と、ループの外側で1度set_time_limit(1)を呼び出して、ループ内でもset_time_limit(1)を呼び出す場合とで、結果が違うことが書かれています。
1秒に制限されているので、ループが1秒以上かかれば強制終了してしまうでしょう。
それを回避するために、一定回数で再度設定しなおせば、タイムアウトのカウンタがゼロになって制限時間が再スタートするのというのが理解できます。

f:id:AJYA:20161209060304j:plain
photo credit: jepoirrier Oops! Delhaize DigitalShelf is not responding! via photopin (license)

set_time_limit()を使ってみる

set_time_limitの興味を持ったコードのように、ループの外側で1度set_time_limitを呼び出して、ループ内でもset_time_limitを呼び出しておけば、確実に実行時間の制限を回避できそうなので、こちらの方法を採用します。