当尝试跟踪 PHP 中的一些内存问题时,我注意到debug_backtrace()
,我在日志代码中调用它,似乎使用了大量内存。
在大多数情况下,以下代码会打印类似的内容0.02 MB
。但在一种情况下,它会打印171.85 MB
!
$before = memory_get_usage();
$backtrace = debug_backtrace(false);
$after = memory_get_usage();
echo round(($after - $before)/1024/1024, 2)." MB";
我的问题是,这是否意味着debug_backtrace
实际上使用了那么多内存吗?或者可能发生其他事情,例如垃圾收集,这会扰乱来自的返回值memory_get_usage
?
最有可能的是导致膨胀的对象。尝试通过false
到该函数,这样您就不会拉动对象,并且您的痕迹会小得多。
编辑:如果通过false
如果您运行的是 PHP 5.3.6+,则不起作用,您可以使用位掩码来限制函数返回的内容。听起来好像你有一个巨大的对象作为参数传递。
http://php.net/manual/en/function.debug-backtrace.php 参考 http://php.net/manual/en/function.debug-backtrace.php
此外,如果您使用 PHP 5.4.0+,他们添加了第二个参数,允许您限制堆栈帧的数量。
编辑2:总计HACK>> 在这里,但是有效...添加一个 try/catch,抛出异常并捕获它,然后转换为字符串或调用异常 getTraceAsString() 以获取完整堆栈。例子:
try {
throw new Exception('ignore this string');
} catch(Exception $e) {
/* @var $trace array */
$trace = $e->getTrace();
// OR
/* @var $str string */
$str = $e->getTraceAsString();
$e = null;
}
在上面的片段中,您可以使用$trace
并构建您自己的输出或仅使用标准异常作为字符串$str
。更容易获得堆栈帧输出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)