1

对于使用CodeIgniter构建的应用程序,我有一个相对较大的 PHP 代码库(数千行)。为了能够跟踪性能问题并能够生成统计数据等,开发服务器运行Xhprof。如果脚本实际上进入了日志记录部分,这可以正常工作。

但是,我现在遇到了脚本超时的情况。在开发服务器上,它只是给出超时(“未找到服务器”)错误,有时甚至会导致 Apache 进程崩溃。不生成 Xhprof 文件,CodeIgniter 日志系统不生成任何内容。错误报告已启用。

在实时环境(好吧,实时服务器的镜像)上,应用程序实际上会生成一个错误:

致命错误:第 493 行 /home/www/application/system/database/drivers/mysql/mysql_driver.php 中允许的内存大小为 33554432 字节已用尽(尝试分配 261900 字节)

这一点,以及如何重现错误的线索,让我有点预感从哪里开始寻找解决方案。但这是一项耗时的工作。

我正在寻找一种能够追踪实际“内存泄漏”发生位置的方法。而不是逐行手动调试。非常感谢任何建议。

更新:服务器内存不足不是问题。在具有更多内存的开发服务器上,也会出现同样的问题。问题是一个无限循环,分配了更多的内存,然后我的服务器可以处理。问题仍然存在:如何快速追踪这些错误?

4

2 回答 2

2

使用xdebug。与 xhprof 不同,使用 xdebug 进行分析会在脚本运行时产生输出,这意味着即使脚本挂起或超时,您也可以剖析到该点生成的跟踪。

另请参阅使用 xdebug 进行分析以开始。

于 2012-08-13T23:46:36.540 回答
2

打算保留统计信息的程序的一个常见问题是保留指向它们所接触的所有内容的指针,这会阻止内存管理回收它们。如果不是这种情况,这可能不是泄漏,它可能只是一个失控的分配。您可能只有少数几个地方可以这样做。一个好的开始是用您自己的函数替换对分配内存块的系统函数的直接调用,然后检测这些函数,寻找意外的大数组分配。

按照现代标准,引用的限制(32mb)并不是很大。除了过程有不合理的下限之外,很可能没有任何问题。

于 2012-08-13T23:31:55.447 回答