【问题标题】:Finding who is referencing an object in php?查找谁在 php 中引用对象?
【发布时间】:2013-01-31 12:33:31
【问题描述】:

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

一些背景:

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

流程基本上是:

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

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

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

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

debug_zval_dump($lObj); echo gc_collect_cycles();

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

debug_zval_dump:引用计数(3) gc_collect_cycles: 0

以上内容让我假设由于某种原因,系统中某处保存了一些对对象的过时引用,但我无法仅通过检查代码来找到它们。

非常感谢任何帮助!

【问题讨论】:

  • 什么?阅读帖子的正文,我完全不知道您要做什么(除非您达到了内存限制)。你能发布一些代码吗?不,没有办法找出引用的位置......
  • ircmaxell:本质上,我只是想找到一种方法来确定何时创建了对对象的新引用,以便我可以在代码中找到引用的位置。类似于对对象的回调,我可以从中运行 debug_backtrace 并手动检查对对象进行引用的位置。

标签: php reference garbage-collection


【解决方案1】:

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

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

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

至于debug_zval_dump(),我会非常谨慎地相信它。如果变量是引用,则需要通过引用传递(在 5.4+ 中不能再这样做了)。所以如果变量是一个引用,它总是会给你一个 refcount什么都可以……

【讨论】:

  • 谢谢,这正是我想要实现的。我的问题是,这是我试图改造对象池的一大段旧代码。我正在拼命寻找所有旧的本地对象缓存,在这个旧代码中到处都有,以便用单个对象池替换它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多