【问题标题】:Catch "Allowed memory size exhausted" fatal errors in Silex在 Silex 中捕获“允许的内存大小已耗尽”致命错误
【发布时间】: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


【解决方案1】:

根据@CharlotteDunois comment - ,您无法使用异常处理程序捕获错误。您甚至无法捕获“内存大小已用尽”错误并继续处理异常。因为就像错误所说的那样,除了抛出错误并退出之外,没有任何内存可以做任何事情。

【讨论】:

    猜你喜欢
    • 2017-12-13
    • 2015-05-30
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多