0

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

一些背景:

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

流程基本上是:

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

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

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

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

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

因此,我看到以下结果:

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

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

非常感谢任何帮助!

4

1 回答 1

3

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

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

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

就 而言debug_zval_dump(),我会非常谨慎地相信它。如果变量是引用,则需要通过引用传递(在 5.4+ 中不能再这样做了)。所以如果变量是一个引用,它总是会给你一个 refcount它为任何事情...

于 2013-01-31T13:00:20.293 回答