【问题标题】:Memory leak in transition from PHP 4 to 5 - any hints?从 PHP 4 到 5 过渡的内存泄漏 - 有什么提示吗?
【发布时间】:2009-10-15 12:25:49
【问题描述】:

我正在将一个大型 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 memory-leaks shared-hosting memory-dump


    【解决方案1】:

    要解决这个问题,我会:

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

    这样做,您将能够:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-12
          • 1970-01-01
          • 2011-03-05
          • 2019-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多