PHP CLIは通常、時間制限がなく、Apacheスレッド/プロセスを使用していないためプライマリが使用されるため、使用されます。
しかし、「無制限の時間」の自由を持ちたくないが、それらのスクリプトを制御し続けたいいくつかのスクリプトにmax_execution_timeを明示的に設定する方法はありますか?
この質問がsuperuser.comでより適切に回答され、それを移動する許可を持っていると思われる場合は、実行してください。 :)
編集:少しグーグルしていて、正しいパラメーターが見つかりました:
php -d max_execution_time=5 script.php
ドキュメント は、コマンドラインモードで実行する場合、デフォルトは0(無制限)であることを示します。オーバーライドできないとは言っていません。
set_time_limit(10); // this way
ini_set('max_execution_time', 10); // or this way
編集:自分で試してみたところ、期待通りに動作します。
F:\dev\www>c:php -f index.php
PHP Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3
Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3
set_time_limit()は、CLIスクリプトで機能します。
<?php
set_time_limit(1); //in seconds
for (;;);
?>
1秒後に次のエラーメッセージが返されます。
PHP Fatal error: Maximum execution time of 1 second exceeded in \
/home/stivlo/test.php on line 4
最初はsleep()で試しましたが、時間制限は適用されません。 @Jonが示唆したように、無限ループが機能するように、実際の計算を使用します。
sleep() PHPページ:
注:set_time_limit()関数と構成ディレクティブmax_execution_timeは、スクリプト自体の実行時間にのみ影響します。 system()、sleep()関数、データベースクエリなどを使用したシステムコールなど、スクリプトの実行外で発生するアクティビティに費やされた時間は含まれませんスクリプトが実行されている最大時間を決定する場合
同様の問題があります。しかし、私の場合、リモートデータベース呼び出しにかなりの時間がかかっていたため、一定時間後にスクリプトを終了したかったのです。他の回答で述べたように、外部呼び出し(またはsleep()
)は、構成されたタイムアウト設定に対してカウントされません。
したがって、私のアプローチはスクリプトpidを把握し、kill -9
スリープ後のコマンド。基本的な例を次に示します。
$cmd = "(sleep 10 && kill -9 ".getmypid().") > /dev/null &";
exec($cmd); //issue a command to force kill this process in 10 seconds
$i=0;
while(1){
echo $i++."\n";
sleep(1); //simulating a query
}
スクリプトが正常に終了し、このkillコマンドが終了するのと同じpidで新しい別のスクリプトが起動する可能性があることに注意してください。それはまずありませんが、このアプローチを使用する場合、可能性としてそれを考慮する必要があります。
set_time_limit 関数を使用します。