【问题标题】:Memory leakage in php unrelated to GC?php中的内存泄漏与GC无关?
【发布时间】:2011-11-03 01:08:11
【问题描述】:

我有一个 php 脚本,它获取图像,处理它,然后将新图像写入文件。我将 imagick/imagemagick 与 php 5.3.8 和 fastcgi 一起使用。在阅读之后,我认为垃圾收集功能可能会有所帮助,但它并没有阻止 php 在 TOP 中的内存使用量从增长到三位数。我曾经在 cron 中运行这个脚本。

<?php
var_dump(gc_enabled()); // true
var_dump(gc_collect_cycles()); // number comes out to 0
?>

不知道该怎么办。到目前为止,唯一有助于控制 php 的方法是每隔一小时左右执行一次“service php-fpm reload”。将imagick用作共享分机而不是静态编译的一个帮助吗?非常感谢任何建议或见解。

【问题讨论】:

  • 如果没有您的脚本源,我不确定我们能否帮助您。
  • 很遗憾我不能在这里发布。
  • 很遗憾,没有更好的提示来说明您在做什么,我们在这里无法为您提供帮助。
  • 所以你说我的问题完全依赖于代码?不一定与扩展本身或php有关?
  • 我不是说它是或不是。如果不知道你在做什么,我无法知道。我怀疑我不是唯一一个,因为你没有得到任何回复。祝你好运。

标签: php memory-leaks imagemagick imagick


【解决方案1】:

两种选择:

  • 通过 gearman 或类似工具将工作分流到一个将完全死掉的脚本。一般来说,我会让我的工人完成一定数量的工作,然后让他们死去。他们将在我的设置中由主管重新启动,所以这不是问题。 N 个请求后的死亡只是避免了内存问题。
  • 从 5.4 开始,这可能会有所帮助:http://ca3.php.net/manual/en/function.apache-child-terminate.php

关于内置库与外部库的说明。我没有玩过这方面的图像魔术,但我在 GD 上看到过。当您使用外部库时,您从 PHP 函数中获得的内存值要低得多,但实际内存使用量几乎相等。

【讨论】:

    【解决方案2】:

    检查内存泄漏的一个好的开始是 valgrind。

    【讨论】:

      【解决方案3】:

      如果 PHP 有大量可用内存可供使用,那么它不会费心擦除内存,因为它认为不需要。随着它使用更多,或者如果其他应用程序开始使用更多内存,那么它会清除它可以使用的内存。

      您可以通过将变量设置为 NULL 来强制清除内存,但建议使用 unset(),因为您不需要强制它使用更少的内存,因为 PHP 会自行清理。

      但除此之外,需要您的代码的 sn-p 才能回答您的问题。

      【讨论】:

      • “如果 PHP 有大量可用内存可供使用,那么它不会费心擦除内存,因为它认为不需要。” 等等,什么?
      • 当然,你 unset() 后它不会立即清除内存,它只是释放它。所以 top 仍然会显示相同的内存使用量,但是如果您的系统开始内存不足或脚本达到其内存限制,PHP 的内存管理将正确释放它。
      猜你喜欢
      • 1970-01-01
      • 2017-12-06
      • 2012-08-31
      • 2010-11-19
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多