20

こんにちは、コマンドのみまたは関数のみに時間制限を設定する可能性があります。例:

function doSomething()
{
    //..code here..

    function1();

    //.. some code here..

}

function1のみに制限時間を設定したい。

set_time_limitが終了しますが、これにより時間制限がスクリプト全体に設定されると思います。誰かアイデアはありますか?

4

6 に答える 6

21

set_time_limit() はグローバルに実行されますが、ローカルでリセットできます。

スクリプトの実行を許可する秒数を設定します。これに達すると、スクリプトは致命的なエラーを返します。デフォルトの制限は 30 秒です。存在する場合は、php.ini で定義されている max_execution_time 値です。

呼び出されると、set_time_limit() はタイムアウト カウンターをゼロから再開します。つまり、タイムアウトがデフォルトの 30 秒で、スクリプト実行の 25 秒後に set_time_limit(20) などの呼び出しが行われた場合、スクリプトはタイムアウトするまで合計 45 秒間実行されます。

私はそれをテストしていませんが、ローカルで設定できるかもしれません。

<?php
set_time_limit(0);  // global setting

function doStuff()
{
    set_time_limit(10);   // limit this function
    //  stuff
    set_time_limit(10);   // give ourselves another 10 seconds if we want
    //  stuff
    set_time_limit(0);    // the rest of the file can run forever
}

// ....
sleep(900);
// ....
doStuff();  // only has 10 secs to run
// ....
sleep(900);
// ....

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

于 2009-07-24T09:13:31.180 に答える
10

制限時間が過ぎたときにfunction1を返すようにするには、それを自分でコーディングする必要があります。

function doStuff($seconds)
{
    $finish=time()+$seconds;

    $done=false;
    $timeout=false;

    while (!$done && !$timeout)
    {
        //do stuff here, set $done to true if you complete

        //out of time?
        $timeout=time() >= $finish;

    }

    return $done; //let caller know if we completed
}

もちろん、経過時間をチェックし続け、必要に応じて終了できるように、実行する「作業」は反復的である必要があります。

任意の関数のタイムアウト実行が必要で、制御が返される場合、それはサポートされていません。本当にこれを行う必要がある場合は、別のプロセスとして設計してください。その後、時間がかかりすぎると思われる場合は、プロセスを閉じることができます。

于 2009-07-24T09:00:09.053 に答える
6
$endtime=time()+10;

while(time()!=$endtime){

    echo ".";
}
于 2014-09-22T22:33:38.940 に答える
3

いいえ、それはできません:max_execution_timeバグのあるスクリプト (無限ループなど) がサーバーを破壊するのを避けるために、セキュリティ対策として使用されます。ただし、関数単位で機能することは意図されていません。

とにかく致命的なエラーで終わるという事実は、ユーザーにとって間違いなく良くありません...

于 2009-07-24T10:35:23.043 に答える
1

exec を使用して、外部アプリケーションからのエクスポートを生成するシェルスクリプトを実行します。スクリプトの実行時間が長すぎると、max_execution_time に達し、ユーザーは何が起こったのかわかりません。このような機能への制限は、終わりが近づいているかどうかを判断し、ユーザーフレンドリーなエラーを送信するのに役立ちます。

于 2009-08-03T04:39:47.607 に答える
0

私はこれが可能だとは思いませんが、なぜあなたはこれをするのですか?スクリプトが中断された場合、私はあなたがそれを望んでいないかもしれません。これは自分自身からの保護のようなものでなければなりません(無限ループや数時間かかるものをアップロードする場合に備えて)が、スクリプトに時間がかかる場合は、それにかかる時間を与えるか、スクリプトを変更する必要があります実行速度が上がるようにします(一部のcronの場合、しばらく時間がかかりますが、頻繁に呼び出される通常のスクリプトがデフォルトの制限時間よりも長くかかる場合は、深刻なパフォーマンスの問題が発生する可能性があります)

于 2009-07-24T09:02:14.307 に答える