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

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

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

    function1();

    //.. some code here..

}

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

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

Ответ 1

set_time_limit() запускается глобально, но может быть reset локально.

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

При вызове set_time_limit() перезапускает счетчик тайм-аута с нуля. В другими словами, если таймаут равен 30 секундам и 25 секундам в script выполняется вызов, такой как set_time_limit (20), scriptбудет работать в общей сложности за 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()... Любое время, потраченное на активность, которая происходит вне выполнения script, например, системных вызовов, используя system(), операции потока, запросы к базе данных и т.д. не включаются при определении максимального времени, в течение которого выполняется script. Это не относится к Windows, где измеренное время реально.

Ответ 2

Вам нужно будет сам это закодировать, если вы хотите, чтобы функция1 возвращалась, когда истекает срок.

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
}

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

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

Ответ 3

$endtime=time()+10;

while(time()!=$endtime){

    echo ".";
}

Ответ 4

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

И тот факт, что он заканчивается с Fatal Error, определенно не очень приятен для пользователя...

Ответ 5

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

Ответ 6

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