0

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

4

3 回答 3

2

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

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

于 2009-10-15T12:33:27.213 回答
2

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

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

这样做,您将能够:

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

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

于 2009-10-15T13:22:19.500 回答
0

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

于 2009-10-15T12:32:28.770 回答