我为我的网站编写了一个错误处理程序,如下所示:
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>
答案 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());
答案 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
答案 2 :(得分:1)
您可以为debug_backtrace设置限制。
print_r(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 50), true);
答案 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提到的循环引用问题不会导致你的记忆力耗尽。