如何在Symfony 1.4中运行任务时使用更少的内存?

2022-08-30 23:28:11

我使用的是Symfony 1.4和Therinition。

到目前为止,我使用Symfony运行任务没有问题。但是现在我必须导入相当大量的数据并将它们保存在数据库中,我得到了臭名昭着的数据

“致命错误:允许的 XXXX 字节内存大小已耗尽”

在此导入过程中,我只创建新对象,设置一些字段并保存它们。

我很确定它与我在保存数据时创建的对象数量有关。但是,取消设置这些对象不会执行任何操作。

是否有任何最佳实践来限制 Symfony 中的内存使用?


答案 1

我遇到了这个问题,我发现有几种技术确实有助于Trinity的广泛内存使用。

1:在可能的情况下,将您的 Doctrine 查询结果冻结为数组。您可以按如下方式执行此操作,例如:

$query = self::createQuery("q")->
  ...
  ->setHydrationMode(Doctrine::HYDRATE_ARRAY)
  ->execute();

这迫使教义不创建大型对象,而是将其简化为数组。显然请记住,如果您这样做,您将失去调用方法等的能力,因此,仅当您将其用于读取字段值等时,这才是好的。

2:执行后释放结果。这记录在教义文档的一个小区域中,但它确实帮助了我使用的导入任务:

$query->free();

就是这样。您也可以对已创建的对象执行此操作,例如,这会强制 Doctrine 删除它创建的所有循环引用。请注意,通过 PHP 作用域或 删除对象时,循环引用会自动从 PHP 5.3 开始释放,但在此之前,您需要自己操作。$myObj->free();unset()

在使用变量后取消设置变量也有帮助,尽管与上述方法结合使用,否则不会清除循环引用。free()unset()


答案 2

试试这个 :

Doctrine_Manager::connection()->setAttribute(Doctrine_Core::ATTR_AUTO_FREE_QUERY_OBJECTS, true );

如上所述

php/symfony/doctrine memory leak?

乔丹·费尔德斯坦的回答不是我的。


推荐