当前位置:  开发笔记 > 编程语言 > 正文

为什么PHP Doctine的free()不起作用?

如何解决《为什么PHPDoctine的free()不起作用?》经验,为你挑选了1个好方法。



1> Stefan Gehri..:

问题是,这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

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有