PHP循环引用问题的规模是什么,我应该担心吗?

meo*_*ouw 5 php garbage-collection circular-reference

如果我使用类似于下面代码的节点树结构,我是否需要担心循环引用?
我已经读过PHP使用内存分配机制,当涉及循环引用时,它可以使垃圾收集器的生活变得非常困难.

我想知道的是:

  • 如果我的树只包含几个节点,比如25,这是一个问题吗?
  • 是在脚本结束时释放内存还是我慢慢为服务器创建问题?
  • 在什么情况下这个问题会在脚本执行期间产生影响?
  • 将手动销毁引用解决问题,我应该总是这样做吗?
class Node {
    private $parent;
    private $children;

    function addChild( Node $child ) {
        $this->children[] = $child;
        $child->setParent( $this );
    }

    function setParent( $parent ) {
        $this->parent = $parent;
    }
}

//eg
$node0 = new Node;
$node1 = new Node;

// nodes 1 and 2 have a circular reference to each other
$node0->addChild( $node1 );
Run Code Online (Sandbox Code Playgroud)

sig*_*g11 4

逐点:

  • 如果我的树仅包含几个节点(例如 25 个),这是否有问题?

除非你的节点是真正的怪物。

  • 脚本结束时内存会被释放还是我会慢慢地给服务器带来问题?

当解释器关闭时,所有内存都会被释放。

  • 脚本执行过程中什么情况下会出现这个问题?

我怀疑你不会有什么需要担心的,除非你有非常低的内存限制或非常大的动态数据结构。如果您有 25 个不经常创建/释放的节点,则不会出现问题。

  • 手动销毁引用可以解决问题吗?我应该始终这样做吗?

我会帮你的。当使用 Propel 将大型数据集加载到数据库中时,我们遇到了很多内存消耗问题,我们跟踪到循环引用未释放。我们的解决方案是调用一个清除所有引用的方法。