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

标签 php memory symfony1 doctrine symfony-1.4

我正在使用 Symfony 1.4 和 Doctrine。

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

"Fatal Error: Allowed memory size of XXXX bytes exhausted"

在此导入期间,我只是创建新对象、设置一些字段并保存它们。

我很确定这与我在保存数据时创建的对象数量有关。但是,取消设置这些对象并没有任何作用。

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

最佳答案

我遇到过这个问题,我发现有一些技术对 Doctrine 的大量内存使用确实有帮助。

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

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

这迫使 Doctrine 不创建大对象,而是将其缩减为数组。显然请记住,如果你这样做,你将失去调用方法等的能力,所以这只有在你使用它来读取字段值等时才有用。

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

$query->free();

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

在你使用它们之后取消设置变量也有帮助,尽管与上面提到的 free() 方法结合使用,因为 unset() 不会否则清除循环引用。

关于php - 如何在 Symfony 1.4 中运行任务时使用更少的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2463337/

相关文章:

symfony1 - 交响乐团 : How to save record with undefined foreign key record

PHP Symfony - 连接已重置 (Windows)

php - 从 MySQL 数据库中选择随机问题; "correct answer"搞砸了

php - 交响乐 : secure delete link with CSRFProtection

c++ - 如何使用 sigsegv 捕获内存读取和写入?

python - 将使用 JSON 数组创建的文件合并到单个文件中

javascript - 使用 Ajax/jQuery/PHP 发送联系表单数据

php - 可变函数与 PHP 7 和 PHP5 的兼容性

C++ 获取分配节的基地址

symfony1 - Symfony 管理员生成器 : To be or not to be?