问题是,这free()
不会从内存中删除Doctrine对象,只是消除了对这些对象的循环引用,使垃圾收集器可以清理这些对象.请参阅Doctrine手册中的23.6 Free Objects:
从版本5.2.5开始,PHP无法垃圾收集具有循环引用的对象图,例如,Parent具有对Child的引用,该引用具有对Parent的引用.由于许多学说模型对象具有这样的关系,即使对象超出范围,PHP也不会释放它们的内存.
对于大多数PHP应用程序来说,这个问题并不重要,因为PHP脚本往往是短暂的.除非您手动断开循环引用链,否则寿命较长的脚本(例如批量数据导入程序和导出程序)可能会耗尽内存.Doctrine在Doctrine_Record,Doctrine_Collection和Doctrine_Query上提供了一个free()函数,它消除了对这些对象的循环引用,将它们释放出来进行垃圾回收.
该解决方案应该是unset()
在$query
使用后的对象free()
:
$query = Doctrine_Query::create() ->from('SubmissionQueue s') ->where('s.time_acted_on IS NULL') ->orderby('s.time_queued') ->limit(1); $query->execute(); print $query[0]->time_queued . "\n"; $query->free(); unset($query); // perhaps $query = null; will also work