查找谁在php中引用对象?

查找谁在php中引用对象?,php,reference,garbage-collection,Php,Reference,Garbage Collection,在PHP中有没有一种方法可以找出对象被引用的位置,从而找到实际上不再需要的过时引用 一些背景: 我正在调试/优化一个用PHP编写的大型系统,试图在运行一些大型批处理作业时减少系统的内存占用 流程基本上是: 1) 设置所有处理所需的一些上下文/对象 2) 对仅与#1中设置的对象相关的对象进行N次迭代操作,在循环中创建的各个对象之间没有关系/耦合 给定足够大的N,系统总是会耗尽内存,即使在步骤#2中创建的每个对象都应该能够在对该特定对象进行处理后进行垃圾收集 在步骤2中的每个迭代结束时,我将执行以下

在PHP中有没有一种方法可以找出对象被引用的位置,从而找到实际上不再需要的过时引用

一些背景:

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

流程基本上是:

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

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

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

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

debug_zval_dump($lObj); echo gc_collect_cycles()

因此,我看到以下结果:

调试转储:refcount(3) gc\u收集\u周期:0

上面的内容让我假设,由于某种原因,系统中某个地方保存了一些对对象的陈旧引用,但仅仅通过检查代码就很难找到它们


非常感谢您的帮助

简单的回答是你所做的是不可能的。从一个变量中,不可能找出指向它的其他变量(至少在PHP中是不可能的)

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

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


至于
debug\u zval\u dump()
,我会非常谨慎地相信它。如果变量是引用,则需要通过引用传递(在5.4+中不能再这样了)。因此,如果变量是引用,它将始终为您提供1的refcount。如果不是引用,则真实引用计数将增加1。在某些边缘情况下,它很有用,但我不会依赖它来做任何事情。

简单的回答是,你所做的是不可能的。从一个变量中,不可能找出指向它的其他变量(至少在PHP中是不可能的)

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

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


至于
debug\u zval\u dump()
,我会非常谨慎地相信它。如果变量是引用,则需要通过引用传递(在5.4+中不能再这样了)。因此,如果变量是引用,它将始终为您提供1的refcount。如果不是引用,则真实引用计数将增加1。它在某些边缘情况下很有用,但我不会依赖它来做任何事情。

可能的重复:什么?读了这篇文章的正文,我不知道你到底想做什么(除了你达到了记忆极限)。你能发一些代码吗?不,没有办法找到引用的位置……ircmaxell:本质上,我只想有一种方法来确定何时创建了对对象的新引用,这样我就可以在代码中找到引用的位置。类似于对对象的回调,我可以从中运行debug\u backtrace并手动检查对象引用的位置。可能重复:什么?读了这篇文章的正文,我不知道你到底想做什么(除了你达到了记忆极限)。你能发一些代码吗?不,没有办法找到引用的位置……ircmaxell:本质上,我只想有一种方法来确定何时创建了对对象的新引用,这样我就可以在代码中找到引用的位置。类似于对对象的回调,从中我可以运行debug_backtrace并手动检查对象引用的位置。谢谢,这正是我试图实现的。我的问题是,这是一段很大的旧代码,我正试图将对象池还原到它。我正在拼命寻找所有旧的本地对象缓存,在这段旧代码中保留了一些,以便用单个对象池替换它。谢谢,这正是我想要实现的。我的问题是,这是一段很大的旧代码,我正试图将对象池还原到它。我正在拼命寻找所有旧的本地对象缓存,这些缓存在这段旧代码中随处可见,以便用单个对象池替换它。