8

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

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 库)之后尝试使用未定义的变量。我假设由于 Amazon AWS 库非常庞大,以至于回溯正在提取大量数据,这会导致内存不足错误 (?)。

我想在可能的情况下包含回溯以帮助调试,但是如何防止调用该debug_backtrace()函数导致致命错误(在我的错误处理程序中,这有点讽刺......)?

4

6 回答 6

8

我怀疑您只需要删除 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->getTrace());

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

于 2014-07-30T16:29:42.220 回答
4

如果可能的话,我会建议替换DEBUG_BACKTRACE_PROVIDE_OBJECTDEBUG_BACKTRACE_IGNORE_ARGS

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

于 2016-11-03T00:07:25.670 回答
3

你可以为你的 debug_backtrace 设置一个限制。

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

PHP 调试回溯

于 2014-07-25T23:13:16.420 回答
1

首先检查是否真的是内存耗尽。一旦我遇到这个错误,我会追踪到一个无限循环。

由于您的服务器不允许 ini_set,我建议您将其复制到本地系统并将内存增加到 1gb 并检查内存是否仍然耗尽,这是一个无限循环。

于 2014-08-01T15:16:35.363 回答
1

可能不是最佳答案,但您是否考虑过使用 var_dump 而不是 print_r?var_dump 只下降了几个嵌套级别,因此 edmondscommerce 提到的循环引用问题不会导致您的内存耗尽。

于 2014-08-01T19:39:30.717 回答
0

尝试增加内存限制:

ini_set("memory_limit","256M");
print_r(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT), true);
于 2014-07-29T15:19:25.230 回答