Ответ 1
Вы можете попробовать что-то вроде этого:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
$NUM_OF_ATTEMPTS = 5;
$attempts = 0;
do {
try
{
executeCode();
} catch (Exception $e) {
$attempts++;
sleep(1);
continue;
}
break;
} while($attempts < $NUM_OF_ATTEMPTS);
function executeCode(){
echo "Hello world!";
}
Здесь мы выполняем цикл do...while
, чтобы код выполнялся хотя бы один раз. Если функция executeCode()
обнаруживает ошибку, она выкинет Exception
, который будет захвачен блоком try...catch
. Блок catch
затем увеличит переменную $attempt
на единицу и вызовет continue
, чтобы проверить условие while
для следующей итерации. Если уже было пять попыток, цикл выйдет, и script может продолжить. Если ошибки нет, т.е. Оператор continue
из блока catch
не выполняется, цикл будет break
, таким образом заканчивая script.
Обратите внимание на использование функции set_error_handler
, взятой из здесь. Мы делаем это так, чтобы все ошибки в функции executeCode()
были пойманы, даже если мы сами не вручную бросаем ошибки.
Если вы считаете, что ваш код может не работать много раз, функция sleep()
может быть полезной перед оператором continue
. "Замедление" по бесконечному циклу поможет вам уменьшить ваш CPU Usage
.
Не рекомендуется бесконечно работать script до тех пор, пока он не будет успешным, поскольку ошибка, которая присутствует в первых 100 итерациях цикла, вряд ли когда-либо будет разрешена, что вызовет script "заморозить". Больше, чем нет, лучше переоценить код, который вы бы хотели запускать несколько раз в случае ошибки, и улучшить его, чтобы должным образом обрабатывать любые возникающие ошибки.