it-swarm.com.ru

Ограничить время выполнения функции или команды PHP

Привет, есть возможность установить ограничение по времени только для команды или только для функции, например:

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

    function1();

    //.. some code here..

}

Я хочу установить ограничение по времени только для функции1.

Там выходит set_time_limit, но я думаю, что это устанавливает ограничение по времени для всего сценария. У кого-нибудь есть идея?

14
Granit

set_time_limit () работает глобально, но его можно сбросить локально.

Установите количество секунд, в течение которых скрипт может быть запущен. Если это достигнуто, скрипт возвращает фатальную ошибку. Предел по умолчанию составляет 30 секунд или, если он существует, значение max_execution_time, определенное в php.ini.

При вызове 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, где измеренное время является реальным.

19
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
}

Конечно, "вещи", которые вы делаете, должны быть итеративными, чтобы вы могли продолжать проверять истекшее время и выходить при необходимости.

Если вы хотите выполнить произвольную функцию по тайм-ауту и ​​вернуть вам управление, это не поддерживается. Если вам действительно нужно это сделать, спроектируйте это как отдельный процесс. Затем вы можете закрыть процесс, если кажется, что он занимает слишком много времени.

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

while(time()!=$endtime){

    echo ".";
}
6
Pipe Soto

Нет, это невозможно: max_execution_time используется в качестве меры безопасности, чтобы избежать ошибок в скриптах (таких как бесконечный цикл), уничтожающих сервер; но он не предназначен для работы на основе функциональных единиц.

И тот факт, что это заканчивается фатальной ошибкой, определенно не очень приятен для пользователя ...

3
Pascal MARTIN

Я использую exec для запуска шеллскрипта, который генерирует экспорт из внешнего приложения. Если скрипт выполняется слишком долго, достигается max_execution_time и пользователь никогда не узнает, что произошло. Ограничение такой функции помогло бы мне определить, близок ли конец, и отправить некоторую дружественную пользователю ошибку.

1
Lukas

я не думаю, что это возможно, но зачем ты это делаешь? Если сценарий когда-либо прервется, я не хочу, чтобы вы этого хотели. Это должно быть больше похоже на защиту от себя (на случай, если вы загрузите бесконечный цикл или что-то, что займет несколько часов), но если ваш сценарий занимает много времени, вы должны либо дать ему время, которое требуется, либо изменить сценарий так что он работает быстрее (для некоторых крон вполне нормально занять некоторое время, но если нормальный сценарий, который вызывается довольно часто, занимает больше времени по умолчанию, вы можете столкнуться с серьезными проблемами с производительностью)

0
Flo