web-dev-qa-db-ja.com

PHPのCLIコンポーネントの最大実行時間をどのように設定しますか?

PHPのCLIコンポーネントの最大実行時間をどのように設定しますか?無限ループに入ったCLIスクリプトがあり、再起動せずにそれを強制終了する方法がわかりません。クイックシルバーを使用して起動したため、コマンドラインでcontrol + cを押すことができません。 _ps -A_(すべてのプロセスを表示)を実行してみましたが、phpがリストに表示されていないため、独自にタイムアウトした可能性があります-制限時間を手動で設定するにはどうすればよいですか?

_max_execution_time_設定をどこに設定するべきかについての情報を見つけようとしましたが、Apacheで実行されるPHPのバージョンに対してこれを設定するのに慣れていますが、どこに設定するのかわかりません。 _/usr/bin_にあるPHPのバージョンの場合。

正確なようですが(以下のスクリーンショットを参照)、次の引用を確認しましたが、実行時間を無制限にするのは良い考えではないようです。

CLIの場合、SAPIのmax_execution_timeは0にハードコードされていることに注意してください。したがって、ini_setまたはset_time_limitによって変更されるようですが、実際には変更されていません。この奇妙な決定について私が見つけた唯一の参照は、バグトラッカー( http://bugs.php.net/37306 )とphp.ini( 'max_execution_time'ディレクティブのコメント)の深い部分です。 ( http://php.net/manual/en/function.set-time-limit.php 経由)

ini_set('max_execution_time')は無効です。私も同じことを試し、set_time_limit(7)で同じ結果を得ました。

更新

したがって、これを実現するには3つの方法があるようです。

スクリプトで:

 set_time_limit(10); //この方法
 ini_set( 'max_execution_time'、10); //またはこの方法

またはスクリプトを呼び出すとき:

 php -d max_execution_time = 5 script.php 

Php.iniファイルがどこからロードされるかについての私の質問に答えるために、存在する場合、それは_/etc/php.ini_からのものです。そのファイルは、phpスクリプトを実行しているユーザーも読み取り可能である必要があるため、rootで作成され、ユーザーが「読み取り」できない場合、phpはおそらく「読み取り」もできません。

ただし、_/etc/php.ini_に設定されたmax_execution_timeは、ファイルが適切にロードされている場合でも(実際にはphpinfo()を使用して)CLIスクリプトに影響を与えないように見えるため、次のいずれかを使用する必要があります。上記の他の方法。

これをテストするためにスリープループを使用することに関して、私はそれが機能しないことを学びました。

Set_time_limit()関数と構成ディレクティブmax_execution_timeは、スクリプト自体の実行時間にのみ影響します。スクリプトが実行された最大時間を判別する際、system()を使用したシステムコール、sleep()関数、データベースクエリなど、スクリプトの実行外で発生するアクティビティに費やされた時間は含まれません。

Stack Overflowで非常によく似た質問を確認してください: https://stackoverflow.com/questions/5874950/set-max-execution-time-in-php-cli

6
cwd

PHPコードの上部に、

ini_set('max_execution_time',300);

または

set_time_limit(300);

本当にループに入りますか?実行のスレッドがPHPの外で拡張機能(または他の場所)に渡された場合、これは効果がありません。

より良い解決策は、スクリプトをウォッチドッグで ラップすることです

4
symcbean

テストスクリプトでsleep(5)を使用して長時間実行時間をテストしましたが、これは有効なテストではありません。

max-execution-timeのドキュメント は次のように言います:

最大実行時間は、システムコール、ストリーム操作などの影響を受けません。

そして set_time_limit()のドキュメント こう言う:

System()を使用したシステムコール、ストリーム操作、データベースクエリなど、スクリプトの実行外で発生するアクティビティに費やされた時間は、スクリプトが実行された最大時間を決定するときに含まれません。これは、測定時間が実際のWindowsでは当てはまりません。

スリープシステムコールを回避する場合、set_time_limit(5);はCLIスクリプトで正常に動作するはずです。 5秒後に終了するテストスクリプトを次に示します。

<?php
set_time_limit(5);

$start = time();
$last = 0;

for ($i=0;$i>=0;$i++) {
    if ($i%10000==0) {
        $took = time()-$start;
        if ($took!=$last) {
            echo "taken {$took} s so far...\n";
            $last=$took;
        }
    }
}
php timeout_test.php 
taken 1 s so far...
taken 2 s so far...
taken 3 s so far...
taken 4 s so far...
taken 5 s so far...
PHP Fatal error:  Maximum execution time of 5 seconds exceeded in /home/tom/MailChap/timeout_test.php on line 8
PHP Stack trace:
PHP   1. {main}() /home/tom/MailChap/timeout_test.php:0
1
Tom