PHP はいい加減なスクリプトからサーバを守ります
PHP には max_execution_time
という、いい加減なスクリプトからサーバを守る設定が存在します。
マニュアル によると
スクリプトがパーサにより強制終了されるまでに許容される最大の時間を秒単位で指定します。
そして、
この命令は、いい加減に書かれたスクリプトがサーバーの負荷を上げることを防止するのに役立ちます。
と続きます。
要するに、うっかり無限ループとかを書いてしまったとしても所定の時間が来たら止めてくれるわけです。
for ($i = 0; $i < 10; $j++) {
// いい加減
}
色んな意味で、さすが PHP と言わざるを得ません。恥ずかしながら、私も稀にお世話になります。
PHP は超いい加減なスクリプトからはサーバを守れません
しかし、マニュアルを読み進めると
最大実行時間は、システムコール、ストリーム操作等の影響を受けません。
と記載されています。さらに
より詳細な情報については、set_time_limit() 関数の説明を参照ください。
とあるので、set_time_limit
の説明を読むと
関数 set_time_limit() と設定ディレクティブ max_execution_time は、 このスクリプト自体の実行時間にのみ影響を与えます。 system() を用いたシステムコール、ストリーム操作、 データベースクエリ等のスクリプト実行以外で発生する処理にかかった時間は スクリプトが実行される最大時間を定義する際には含まれません。 ただし、Windows ではこれは当てはまりません。 計測された時間は実際の時間と等しくなります。
とあります。
要するに、「実行時間」とは「ユーザCPU時間」のことなのです。なので
for ($i = 0; $i < 10; $j++) {
// 超いい加減
sleep(1);
}
うっかりこんなことをしてしまうと、sleep している間は「ユーザCPU時間」は増えませんから(ループ内に sleep 以外の処理がどれだけあるかにもよりますが)いつまでたってもループし続けるはめになってしまいます。
みなさんくれぐれもお気をつけ下さい。