php - 你如何调试 php "Out of Memory"问题?

标签 php debugging memory methodology

我最近遇到了一些关于 PHP 内存限制的问题:

Out of memory (allocated 22544384) (tried to allocate 232 bytes)

这些调试起来很麻烦,因为我没有太多关于导致问题的信息。

添加关机功能有帮助

register_shutdown_function('shutdown');

然后,使用 error_get_last ();我可以获得有关最后一个错误的信息,在这种情况下,是“内存不足” fatal error ,例如行号和 php 文件名。

这很好,但是我的 php 程序是面向对象的。堆栈深处的错误并不能告诉我太多有关错误发生时的控制结构或执行堆栈的信息。我试过debug_backtrace(),但这只是显示关闭期间的堆栈,而不是错误时的堆栈。

我知道我可以使用 ini_set 或修改 php.ini 来提高内存限制,但这并没有让我更接近于真正弄清楚是什么消耗了这么多内存或我的执行流程在错误期间的样子。

谁有调试高级面向对象 PHP 程序中内存错误的好方法?

最佳答案

echo '<pre>';
$vars = get_defined_vars();
foreach($vars as $name=>$var)
{
    echo '<strong>' . $name . '</strong>: ' . strlen(serialize($var)) . '<br />';
}
exit();

/* ... Code that triggers memory error ... */

我使用它在我的代码的问题部分之前打印出当前分配的变量列表,以及对变量大小的(非常)粗略估计。我返回并unset 任何在兴趣点和兴趣点之外不需要的东西。

在无法安装扩展程序时很有用。

您可以修改上面的代码以使用 memory_get_usage 以某种方式为您提供对变量中内存的不同估计,不确定它是更好还是更差。

关于php - 你如何调试 php "Out of Memory"问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6114155/

相关文章:

php - cURL 不确定是否启用

php - MySQL PHP 黑客攻击预防/数据库备份?

php - 从多个表中获取数据 Laravel

python - Django 上的多个站点

c - DirectShow 数据复制太慢

javascript - 实时显示日期时间时出现问题(JavaScript/JQuery)

perl - 当 "Can' t 通过包 y 定位对象方法 x 时打印堆栈跟踪"(Perl)

ios - 在 Xcode 和 iOS 中调试应用程序启动

c - 如何在 ubuntu 中使用 bochs?

Ruby 不释放内存