Doctrine - Sonata Admin 内存耗尽?

Doctrine - memory exhausted on Sonata Admin?

我有 Movie 实体,它与 ActorDirectorProducer,Company` 等实体有 ManyToMany 联系。

在编辑电影时,有很多这样的实体(演员:90k,导演:40k,制片人:20k,公司:40k)可供选择。

当我尝试在 Sonata Admin 中为我的实体加载 "edit" 页面时,我收到错误 500 并且 php 日志在以下文件之一中显示 Allowed memory size of 134217728 bytes exhausted

\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php on line 2577
\vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\AbstractHydrator.php on line 296
\vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php on line 529

当数据库中每个实体有大约 10 个对象时,它适用于固定装置。

我目前正在测试迁移,我假设编辑页面上会加载大量数据并且页面本身可能运行缓慢(将有四个 select2 字段,每个选择题,每个都有数千个实体连接到编辑的实体),但我很惊讶它发生在学说层面。我希望 Sonata Admin 能够处理它,因为它可以毫无问题地列出大量 Actor 对象、分页等

我应该如何安排与 Movie 实体的合作?你能给我一些建议吗?我正在考虑 changing that CRUD page,因此 Select2 会使用 Ajax 获取数据,但我仍然不确定这是一个最好的主意。

您可以通过向 php.ini

添加更多内容来增加 memory_limit

在 AppKernel.php 之上找到正确的位置 phpInfo(); 并在输出中搜索 "php.ini",然后编辑 ini 文件并更改行 ´memory_limit 到 2G 例如

此外,如果可能,您应该避免导致内存大小耗尽的对象水化(将结果行水化为实体),这里有一些关于

的信息

http://labs.octivi.com/mastering-symfony2-performance-doctrine/

您需要考虑应用程序的使用方式。 在你的编辑面板中,你认为你的实体上所有可能的关系(演员,导演......)的列表将是最好的用户体验,我不这么认为。

您的实体将获取所有依赖项并将它们合并到对象中。您可以看到这对您的内存来说是个问题,即使您将内存限制设置为 1To。

我推荐的是使用自动完成。这样您就不会加载数以千计的无用数据,应用程序会更快,用户将能够搜索他正在寻找的内容,而不是在无休止的 select 框中搜索。

希望对您有所帮助。