查找谁在 php 中引用对象


Finding who is referencing an object in php?

PHP中有没有办法找出引用对象的位置,以便找到实际上不再需要的过时引用?

一些背景:

我正在调试/优化一个用PHP编写的大型系统,试图在运行一些大型批处理作业时减少系统的内存占用。

流程基本上是:

1) 设置所有处理所需的一些上下文/对象

2) 迭代 N 次仅与 #1 中设置的对象相关的对象,循环中创建的各个对象之间没有关系/耦合

给定足够大的 N,系统将始终耗尽内存,即使在步骤 #2 中创建的每个对象都应该能够在对该特定对象进行处理后进行垃圾回收。

在步骤 2 的每次迭代结束时,我将执行以下操作:

debug_zval_dump($lObj);回显gc_collect_cycles();

因此,我看到了以下结果:

debug_zval_dump: 参考文献(3)gc_collect_cycles: 0

以上使我假设由于某种原因,有一些对保存在系统中某处对象的过时引用,但是仅通过检查代码就很难找到它们。

任何帮助非常感谢!

简短的回答是,你正在做的事情是不可能的。从一个变量中,不可能弄清楚其他变量指向它(好吧,至少从PHP中是不可能的)。

我的建议是设置一个对象池。完成对象后,您可以"释放"对象。这样,池就知道你是否可以重用该对象(或者如果空闲对象太多,则将其丢弃)。

简而言之,内存管理需要跨多个代码段进行协作。如果您将副本存储在任何一侧,则不能指望它们只是透明地工作。

debug_zval_dump()而言,我会非常谨慎地信任它。如果变量是引用,则需要通过引用传递(在 5.4+ 中不能再传递)。因此,如果变量是引用,它将始终为您提供 refcount 1。如果它不是参考,则真实引用计数将增加 1。它在某些边缘情况下很有用,但我不会依赖它做任何事情......