web-dev-qa-db-ja.com

関数またはコマンドの実行時間を制限するPHP

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

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

    function1();

    //.. some code here..

}

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

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

15
Granit

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では当てはまりません。

20
Alister Bulman

制限時間が過ぎたときに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
}

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

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

8
Paul Dixon
$endtime=time()+10;

while(time()!=$endtime){

    echo ".";
}
6
Pipe Soto

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

そして、それが致命的なエラーで終わるという事実は、とにかくユーザーにとって間違いなく素晴らしいことではありません...

3
Pascal MARTIN

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

1
Lukas

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

0
Flo