【发布时间】:2015-11-25 16:40:12
【问题描述】:
是否可以使用 ErrorHandler/ExceptionHandler 模块在 Silex 中捕获“Allowed memory size of [n] bytes exhausted”致命错误?
一个简单的测试用例展示了如何轻松捕获其他类型的致命错误 - 例如,以下将捕获 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;
}
是否可以使用 Silex 捕获这些致命错误,还是我需要使用 PHP 的原生 register_shutdown_function 来代替?
【问题讨论】:
-
不,您无法使用异常处理程序捕获错误。您甚至无法捕获“内存大小已用尽”错误并继续处理异常。因为就像错误所说的那样,除了抛出错误并退出之外,没有任何内存可以做任何事情。
-
看看 PHP7 如何处理这个问题会很有趣,因为您现在应该能够捕获致命异常。
-
您也可以尝试stackoverflow.com/questions/8440439/…上最后一个答案中的方法。这个想法是留出一块内存,然后在处理错误的开始释放它。
标签: php symfony error-handling try-catch silex