在自定义错误处理程序中使用debug_backtrace()时如何避免“内存...耗尽”错误?

时间:2014-07-23 21:07:58

标签: php error-handling custom-error-handling

我为我的网站编写了一个错误处理程序,如下所示:

function errorHandler($number, $string, $file, $line, $context, $type = '') {
// save stuff in DB
}

我注册的内容如下:

set_error_handler('errorHandler', E_ALL);

我保存了数据库中所有传递的变量,以及一个回溯来帮助我调试问题:

print_r(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT), true)

问题是我有时会收到此错误:

  

允许的内存大小为134217728字节耗尽(尝试分配30084081字节)

错误处理程序在发出上述错误时运行的原因是我在创建了Amazon S3对象(来自他们的PHP AWS库)之后尝试使用未定义的变量。我假设,因为亚马逊AWS库非常庞大,以至于回溯正在吸引大量数据,导致内存不足错误(?)。

我希望在可能的情况下包含一个回溯来帮助调试,但是如何防止调用debug_backtrace()函数导致致命错误(在我的错误处理程序中,这有点讽刺......)?< / p>

6 个答案:

答案 0 :(得分:3)

我怀疑你只需删除DEBUG_BACKTRACE_PROVIDE_OBJECT

可能是您的代码在对象中具有循环引用,这意味着在转储它们时它会循环直到所有内存都被占用。

另一种替代方法是抛出并捕获异常,然后使用它来获取回溯

try{
  throw new Exception();
}catch(Exception $e){
  echo $e->getTraceAsString();
}

http://php.net/manual/en/exception.gettraceasstring.php

或者,如果您需要详细程度,请尝试print_r($ e-&gt; getTrace());

http://php.net/manual/en/exception.gettrace.php

答案 1 :(得分:2)

我建议尽可能用 'bookISBN' => array( 'required' => array( 'required' => true, 'setMessage' => 'ISBN is required' // Only this shows if field is empty ), 'validators' => array( new Validator\Isbn(array( 'setMessage'=> 'ISBN is Invalid' // only this shows if the input is invalid )), ) ), 替换DEBUG_BACKTRACE_PROVIDE_OBJECT

http://php.net/manual/en/function.debug-backtrace.php

答案 2 :(得分:1)

您可以为debug_backtrace设置限制。

print_r(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 50), true);

PHP debug_backtrace

答案 3 :(得分:1)

尝试增加内存限制:

ini_set("memory_limit","256M");
print_r(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT), true);

答案 4 :(得分:1)

首先检查它是否真的是令人筋疲力尽的记忆。 一旦我有这个错误,我追溯到无限循环。

因为你的服务器不允许使用ini_set,我建议你把它复制到本地系统并将内存增加到1GB并检查内存是否仍然耗尽,这是一个无限循环。

答案 5 :(得分:1)

可能不是最佳答案,但你考虑过使用var_dump而不是print_r吗? var_dump只会降低几个嵌套级别,因此edmondscommerce提到的循环引用问题不会导致你的记忆力耗尽。