Можно ли поймать «Разрешенный размер памяти [n] байт исчерпал« фатальные ошибки в Silex с использованием модулей ErrorHandler/ExceptionHandler?Поймать «Разрешенные размеры памяти исчерпаны» фатальные ошибки в Silex
Простой тест показывает, как легко поймать другие виды фатальной ошибки - например, следующее будет поймать фатальную ошибку PHP String size overflow
:
use Symfony\Component\Debug\ErrorHandler;
use Symfony\Component\Debug\ExceptionHandler;
$errorHandler = function($e) {
error_log("Caught an error!");
};
ErrorHandler::register();
$exceptionHandler = ExceptionHandler::register();
$exceptionHandler->setHandler($errorHandler);
$a = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
while (true) {
$a .= $a;
}
Но это не работает для памяти превышена фатальные ошибки : следующий код вызывает фатальную ошибку, которая не будет поймана:
use Symfony\Component\Debug\ErrorHandler;
use Symfony\Component\Debug\ExceptionHandler;
$errorHandler = function($e) {
error_log("Caught an error!");
};
ErrorHandler::register();
$exceptionHandler = ExceptionHandler::register();
$exceptionHandler->setHandler($errorHandler);
$a = ['a' => ['AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA']];
while (true) {
$a[] = $a;
}
можно ли поймать эти фатальные ошибки с помощью силикатного, или мне нужно использовать PHP родной register_shutdown_function
вместо этого?
Нет, вы не можете поймать ошибку с обработчиком исключений. Вы не можете уловить даже «Ошибки памяти с исчерпанными» и исправить исключение. Потому что, как говорится в ошибке, никакой памяти не осталось, кроме как бросать ошибку и выходить из нее. –
Будет интересно посмотреть, как PHP7 может справиться с этим, так как теперь вы сможете уладить фатальные исключения. –
Вы также можете попробовать метод в последнем ответе на http://stackoverflow.com/questions/8440439/safely-catch-a-allowed-memory-size-exhausted-error-in-php. Идея состоит в том, чтобы выделить кусок памяти, а затем освободить ее в начале обработки ошибки. –