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

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

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

    function1();

    //.. some code here..

}

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

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

6 ответов


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


вам нужно будет кодировать это самостоятельно, если вы хотите, чтобы 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
}

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

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


$endtime=time()+10;

while(time()!=$endtime){

    echo ".";
}

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

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


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


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