PHP的规模是多少;这是循环引用问题,我应该担心吗?

PHP的规模是多少;这是循环引用问题,我应该担心吗?,php,garbage-collection,circular-reference,Php,Garbage Collection,Circular Reference,如果我使用的是类似于下面代码的节点树结构,我需要担心循环引用吗? 我已经读到PHP使用了一种内存分配机制,当涉及循环引用时,这会使垃圾收集器的工作变得非常困难 我想知道的是: 如果我的树只有几个节点,比如说25个,这是个问题吗 是在脚本结束时释放内存,还是我正在缓慢地为服务器制造问题 在什么情况下,此问题会在脚本执行期间产生影响 手动销毁引用会解决问题吗?我应该一直这样做吗 也许是这样,但由于它在每个请求结束时抛出所有对象(除非您正在缓存),我认为许多PHP程序员不会担心这一点 如果您正在用

如果我使用的是类似于下面代码的节点树结构,我需要担心循环引用吗?
我已经读到PHP使用了一种内存分配机制,当涉及循环引用时,这会使垃圾收集器的工作变得非常困难

我想知道的是:

  • 如果我的树只有几个节点,比如说25个,这是个问题吗
  • 是在脚本结束时释放内存,还是我正在缓慢地为服务器制造问题
  • 在什么情况下,此问题会在脚本执行期间产生影响
  • 手动销毁引用会解决问题吗?我应该一直这样做吗

也许是这样,但由于它在每个请求结束时抛出所有对象(除非您正在缓存),我认为许多PHP程序员不会担心这一点

如果您正在用PHP编写命令行脚本,那么您可能有理由担心它,但在它成为值得担心的事情之前,您必须编写一些非常复杂的PHP代码。如果是这样的话,你会有更大的问题


祝你好运。

考虑到大多数PHP页面的性质——也就是说,该过程针对一个网页运行,并在完成时被丢弃——我相当怀疑这是一个问题。我以前没有看到循环引用的问题,并且使用它们时没有问题。根据我的经验,仅在内存消耗方面会遇到更多的问题,但PHP5已经在某种程度上缓解了这一问题,它不再只是复制对象和数组,除非另有说明。

逐点:

  • 如果我的树只有几个节点,比如说25个,这是个问题吗
除非你的节点是真正的怪物

  • 是在脚本结束时释放内存,还是我正在缓慢地为服务器制造问题
当解释器关闭时,所有内存被释放

  • 在什么情况下,此问题会在脚本执行期间产生影响
我怀疑你会有什么担心,除非你有非常低的内存限制或非常大的动态数据结构。如果有25个节点不经常被创建/释放,则不会出现问题

  • 手动销毁引用会解决问题吗?我应该一直这样做吗

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

PHP5.3将包括循环引用检测和销毁功能。这是一个可选设置,只应在必要时使用,因为垃圾收集器会受到性能影响,但它是为您的示例量身定制的


现在开发,注意在_destruct()方法中显式取消引用,并在可能的情况下升级到5.3

我想这应该没问题。好的,这就是PHPDOM实现的工作原理。此外,还有_destruct()方法。据我所知(在php5.3之前),只有在没有对对象的引用时才调用_destruct。因此,如果它是循环引用的一部分,则必须显式调用uu析构函数。
u析构函数
将作为PHP 5.3中脚本末尾的
关闭序列
的一部分调用。但是,在这种情况下,调用序列是随机的(也就是说,当其他对象仍然引用所述对象时,可以调用
\uu destruct
)。您是如何创建此方法的。我自己的ORM也遇到了同样的问题。只是在测试中遇到了问题,因为否则脚本就不会那么长。不幸的是,我已经有很长一段时间没有参与推进工作了,我再也无法访问代码了。对不起,安卓。
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 );