LoginSignup
8
4

More than 5 years have passed since last update.

PHP の max_execution_time は、いい加減に書かれたスクリプトがサーバーの負荷を上げることを防止するのに役立ちますが、超いい加減に書かれた スクリプトがサーバーの負荷を上げることを防止するのには役立ちません

Posted at

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 以外の処理がどれだけあるかにもよりますが)いつまでたってもループし続けるはめになってしまいます。
みなさんくれぐれもお気をつけ下さい。

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4