从 PHP 4 过渡到 PHP 5 的内存泄漏 - 有什么提示吗?

Memory leak in transition from PHP 4 to 5 - any hints?

提问人:Pekka 提问时间:10/15/2009 最后编辑:hakrePekka 更新时间:12/25/2012 访问量:348

问:

我正在将一个大型 Web 应用程序移植到共享 Web 托管环境。 该应用程序是用 PHP 4 编写的。新环境具有 PHP 5.2。

出于某种原因,该应用程序在 PHP 5.2 中运行时会泄漏大量内存。我可以使用 memory_get_usage() 从字面上观察内存使用量,直到它达到 64 MB 的限制(这在共享环境中非常慷慨,该站点过去在 PHP 4 上以 12 或 16 MB 运行)。

我怀疑这是 PHP 5 中更改的副作用,很可能是参数中对象引用的处理。然而,寻找导致泄漏的特定行为是非常困难的,因为应用程序非常复杂,而且部分写得不是很好(是的,这是我的)。

由于该应用程序安装在共享网络空间上,因此我无法使用经典的调试工具(据我所知)。我非常非常希望避免在本地重新创建环境,因为我整天都在为这个项目工作一段时间。

所以我的问题是:

  • 有谁知道典型的 PHP4 => 5 个过渡陷阱,尤其是在处理大量对象时,这可能是我泄漏的原因

  • 有没有人知道某种独立于调试器的、仅限脚本的“图形范围转储”工具,用于 PHP 使用的变量,可以帮助我找出哪些变量正在占用这些巨大的内存?

php 泄漏共享 主机 内存转储

评论


答:

0赞 Cesar 10/15/2009 #1

如果没有调试器,您可以打开一个您认为会占用大量内存的脚本,并将memory_get_usage函数放在关键局部变量中。

2赞 Jeff Ober 10/15/2009 #2

我在 5.2 的一个版本中发现的一个常见问题是 strtotime 泄漏而没有memory_get_usage发现它。更改为 strptime 解决了这个问题。

5.2.8 - http://bugs.php.net/bug.php?id=46889 有一个错误报告。

2赞 Toto 10/15/2009 #3

为了解决这个问题,我会:

  1. 使用 xdebug+wincachegrind(或其他一些分析器)和/或 firephp 分析脚本。
  2. 打开 STRICT 模式以获取所有 php 错误 + 通知。

这样做,您将能够:

  • 优化代码。(删除错误/警告/通知可以加快代码速度)
  • 清理代码。(使用正确的 php5 对象语法只会对性能有好处)。

对象模型从 PHP4 完全更改为 PHP5。当然,STRICT 模式会告诉你,你不应该使用显式的“通过引用传递”。