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

Весь раздел переключателя является единственным контекстом объявления. Вы не можете объявить переменную в операторе выбора как этот. Попробуйте это вместо этого:

switch (val)  
{  
case VAL:
{
  // This will work
  int newVal = 42;
  break;
}
case ANOTHER_VAL:  
  ...
  break;
}
15
задан Greg 24 July 2009 в 09:05
поделиться

5 ответов

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

20
ответ дан 1 December 2019 в 01:11
поделиться

Вам нужно будет написать этот код самостоятельно, если вы хотите, чтобы функция 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
ответ дан 1 December 2019 в 01:11
поделиться

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

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

3
ответ дан 1 December 2019 в 01:11
поделиться

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

0
ответ дан 1 December 2019 в 01:11
поделиться

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

1
ответ дан 1 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: