【问题标题】:PHP Possible Memory LeakPHP 可能的内存泄漏
【发布时间】:2010-06-17 12:02:47
【问题描述】:

我有一个脚本,它遍历数据库以使用 gd 和 imagick 转换图像。

我取消设置或替换每个循环之间的所有变量和对象。

对于每个循环,get_memory_usage(1) 显示该脚本使用的并发内存量。这是预期的。

但是,当我运行“top”时,%MEM 列报告此脚本(相同的 PID)在每个循环中以几个百分比递增。

当我处理完所有图像以及运行 get_defined_vars(); 时,我会销毁它们。只设置了标准的全局变量和我拥有的一些变量。

为什么 "top" % Memory Usage 与 PHP 报告的不同?

10 次循环后,PHP 占用了 20% 的系统内存。

我在 Debian 5 上运行 php 5.2.6

【问题讨论】:

  • 您可能会发现这很有帮助stackoverflow.com/questions/849549/…
  • @Mike B 接受的答案已经过时,因为 PHP 现在确实有一个垃圾收集器。这在这个问题上并不重要,因为他正在运行 5.2-
  • @Artefacto 当时我也是,这就是为什么我认为它会对 dropson 有所帮助。所以接受的答案仍然适用于两个问题的指定参数。

标签: php memory-leaks loops


【解决方案1】:

您是否将第一个参数传递给memory_get_usage()?如果没有,您应该先尝试一下。如需更多信息,我们需要您的源代码。

【讨论】:

  • 什么?隐藏第二个参数?
  • afaik 只有一个参数可以显示实际系统使用情况,是的,我正在使用它。恐怕我无法粘贴代码。我使用了一个名为 amazon-s3-php-class 的类,它缓冲本地文件以通过 CURL 上传。从我的测试来看,情况似乎是这样,我需要能够清空该缓冲区,或者告诉 GC 以某种方式立即将其删除。
  • @thephpdeveloper:正确,应该是'first参数'。固定。
  • @dropson:会不会是你正在使用的类在类中设置全局变量或静态变量?
  • 问题在于 GD,它在 PHP 中作为扩展加载,可能不受 php 内存管理器管理。因此,当释放资源时,它会在 PHP 内部被释放,而不是在系统中,直到 gc 以某种方式卸载资源。我正在从源代码安装 PHP 5.3.2,以检查新的 gc_collect_cycles() 函数,以强制 GC。
【解决方案2】:

我必须自己回答这个问题。

升级到 PHP 5.3.2 消除了垃圾堆积率如此之大的问题。

因为有一些我无法识别的泄漏,并且无论我做什么都会在填充 GD 图像资源方面重置,所以我决定让 perl 脚本运行 while 循环,并执行 PHP 脚本

system("php /opt/cron/tasks.php");

这样 PHP 总是清空缓冲区/内存。

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多