【发布时间】:2011-04-15 10:45:06
【问题描述】:
我意识到对这个问题的下意识回答是“你不知道”,但请听我说完。
基本上,我在 SQL 上的活动记录系统上运行,为了防止同一数据库行的重复对象,我在工厂中为每个当前加载的对象保留一个“数组”(使用自动增量 'id'作为关键)。
问题是,当我尝试通过这个系统处理 90,000+ 行时,PHP 会遇到内存问题。这很容易通过每隔几百行运行一次垃圾收集来解决,但不幸的是,由于工厂存储了每个对象的副本 - PHP 的垃圾收集不会释放这些节点中的任何一个。
我能想到的唯一解决方案是检查存储在工厂中的对象的引用计数是否等于 1(即没有引用该类),如果是,则释放它们。这将解决我的问题,但是 PHP 没有引用计数方法? (除了debug_zval_dump,但那几乎没用)。
【问题讨论】:
-
你只是将ID存储在数组中还是整个对象中?
-
ID 是键,整个对象的“引用”是值: static $cache = array(1122=>new Client(1222), 1864=>new Client(1864), ...)
标签: php