从PHP 4过渡到5的内存泄漏 - 任何提示?

时间:2009-10-15 12:25:50

标签: php memory-leaks shared-hosting memory-dump

我正在将一个大型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使用的变量,可以帮助我找出哪些变量占用了大量的内存?

3 个答案:

答案 0 :(得分:2)

我在一个5.2版本中发现的一个常见问题是strtotime在没有memory_get_usage捕获的情况下泄露。改为strptime解决了这个问题。

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

答案 1 :(得分:2)

要解决这个问题,我会:

  1. 使用xdebug + wincachegrind(或其他一些分析器)和/或firephp配置脚本。
  2. 打开STRICT模式以获取所有php错误+通知。
  3. 这样做,你将能够:

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

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

答案 2 :(得分:0)

如果没有调试器,您可以打开一个您认为使用大量内存的脚本,并将memory_get_usage函数放入关键的本地。

相关问题