У меня есть действия контроллера следующим образом:
public function actionTest()
{
set_time_limit(1);
register_shutdown_function(function()
{
var_dump('shutdown');
});
while(true){} //infinite loop
}
И я все еще получаю фатальную ошибку «Максимальное время выполнения превысило 1 секунду»
Если я не сплю или превышаю время выполнения, вызывается функция выключения.
В соответствии с http://php.net/manual/en/function.register-shutdown-function.php#33575 и несколько примеров из интернета, завершение работы должно быть вызвано, даже если время выполнения превышено.
Как я должен обработать ошибку времени выполнения?
Бьюсь об заклад, PHP бросает фатальную ошибку до запуск вашей функции выключения. Что-то вроде «Фатальная ошибка: превышено максимальное время выполнения». Yii; обработчик ошибок ловит все ошибки PHP, отображает сообщение об ошибке и умирает до того, как PHP получит возможность запустить вашу функцию. Таким образом, ваша функция никогда не будет выполнена.
Есть несколько решений этой проблемы. Во-первых, вы можете полностью отключить обработку ошибок PHP в Yii, добавив эту строку в index.php
,
define(YII_ENABLE_ERROR_HANDLER, false);
Во-вторых, вы можете попробовать отключить сообщения об ошибках в php.ini, используя error_reporting
или же display_errors
директивы.
В-третьих, вы можете отлавливать ошибки PHP, используя блок try-catch и перехватывая ErrorException
учебный класс. Просто поймайте исключение и ничего не делайте:
Других решений пока нет …