【问题标题】:Disable Garbage Collection禁用垃圾收集
【发布时间】:2011-10-15 01:33:31
【问题描述】:

如何禁用长时间运行的 php cli 脚本的垃圾收集?我正在处理脚本中的变量设置。

【问题讨论】:

  • @levu:这是否会禁用收集器,直到进程可用的最大值被消耗完?
  • 嗯,你为什么需要这个?似乎需要很多的工作,并且 gc 处理程序在 PHP >= 5.3.... 中得到了极大的改进
  • 嗯,有人愿意解释对这个问题的反对意见吗?它和问题一样有效....投票只是因为我不同意反对:)
  • @Wrikken 我没有 dv 但我可以想象这是因为it's very much a General Reference question
  • @Wrikken:我做到了。我的意图不是“这是一个无效的问题”(否则我会近距离投票),而是“它没有用”。原因:a) 问题就像“我要把自己射到脚上” b) 之前这个问题应该是“unset()/GC 是如何工作的?”。有人可能会读到这篇文章并得出结论,这是一个好主意,甚至(更糟)这是内存关键应用程序中的一种用例。

标签: php garbage-collection


【解决方案1】:

我遇到了类似的情况,在我的情况下,问题是 Zend Server 作为 cli 运行时任意崩溃,而且经常崩溃。在我发现的一篇文章中,解决此问题的一种方法是禁用“垃圾收集器”

正如在其他帖子中所说,您可以通过禁用 zend.enable_gc 来做到这一点

在 php.ini 中

zend.enable_gc = Off

你也可以修改你的Php初始化脚本,或者直接在cli中修改,

$ php -d zend.enable_gc=0 your_script.php

(抱歉重新打开这么旧的帖子) 希望这可以帮助某人

【讨论】:

  • 这在 php 5.3.x 上帮助了我——我猜是因为 GC 在这个版本的 beta 模式下运行。
【解决方案2】:

取消设置变量不会释放内存!它只是从变量中删除对相应值的引用。一旦任何值的引用计数为0,GC 就会收集该值并释放其分配的内存。如果可以完全禁用 GC,您将破坏您的解释器(在最好的情况下):您的内存中将有许多未引用的数据,这些数据永远不会被清除。这就是所谓的“内存泄漏”。

Is there garbage collection in PHP?

【讨论】:

    【解决方案3】:

    来源:php.net

    Besides changing the zend.enable_gc configuration setting, it is also possible to turn the garbage collecting mechanism on and off by calling gc_enable() or gc_disable() respectively. 
    

    【讨论】:

      【解决方案4】:

      你可以禁用垃圾收集器

      或通过 ini 设置:

      但是,使用unset 不会释放内存。它只标记 GC 收集 afaik 的变量。见Garbage Collection in the PHP Manual for details.章节

      【讨论】:

      • 试过了,只有5.3+才有,我用的是5.2.17
      • 只影响循环引用GC,不影响“普通”GC。
      • @King 没有“普通”的。这是唯一的 GC。
      • 那是错误的。简而言之:循环 GC 是 PHP5.3 附带的,你真的相信,在 5.3 之前从来没有 GC?稍长一点:在 PHP 中绝对没有办法分配或释放内存。您只能创建或删除对解释器为您分配的值的引用。
      • @Gordon:PHP 有一个垃圾收集器已经很久了。早在 5.3 之前。在 5.3 之前,它是一个简单的基于 refcount 的 GC,它只检查对变量的引用数量(而不是查看循环引用)。它在您显式取消设置变量后运行,并且在您离开范围后(以及脚本终止时)运行。 5.3 为该基本功能添加了循环引用收集器。禁用 gc_disable() 只会停止循环 GC 机制的运行。 refcount 原语仍在运行...否则 unset() 和范围更改将永远不会释放内存...
      猜你喜欢
      • 2020-01-21
      • 2016-01-29
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 2011-03-10
      相关资源
      最近更新 更多