2015-08-31 2 views
3

Можно ли поймать «Разрешенный размер памяти [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 вместо этого?

+2

Нет, вы не можете поймать ошибку с обработчиком исключений. Вы не можете уловить даже «Ошибки памяти с исчерпанными» и исправить исключение. Потому что, как говорится в ошибке, никакой памяти не осталось, кроме как бросать ошибку и выходить из нее. –

+0

Будет интересно посмотреть, как PHP7 может справиться с этим, так как теперь вы сможете уладить фатальные исключения. –

+1

Вы также можете попробовать метод в последнем ответе на http://stackoverflow.com/questions/8440439/safely-catch-a-allowed-memory-size-exhausted-error-in-php. Идея состоит в том, чтобы выделить кусок памяти, а затем освободить ее в начале обработки ошибки. –

ответ

1

Согласно @CharlotteDunois comment - no, вы не можете поймать ошибку обработчиком исключений. Вы не можете уловить даже «Ошибки памяти с исчерпанными» и исправить исключение. Потому что, как говорится в ошибке, никакой памяти не осталось, кроме как бросать ошибку и выходить из нее.

Смежные вопросы