Doctrine - Sonata Admin 内存耗尽?
Doctrine - memory exhausted on Sonata Admin?
我有 Movie
实体,它与 Actor
、Director
、Producer,
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 框中搜索。
希望对您有所帮助。
我有 Movie
实体,它与 Actor
、Director
、Producer,
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 框中搜索。
希望对您有所帮助。