Symfony2/Doctrine 提交表单需要很长时间
Posted
技术标签:
【中文标题】Symfony2/Doctrine 提交表单需要很长时间【英文标题】:Symfony2/Doctrine submiting form takes a really long time 【发布时间】:2014-06-10 13:11:22 【问题描述】:我们在使用 Symfony2 和 Doctrine 创建一个小型实体时遇到了问题,它可以工作,但速度很慢,而且会耗尽内存。
我们认为问题在于 Symfony 的 $form->submit()
。
这需要大约 0.1 秒:
die('x');
$form->submit($request);
这需要大约 60 秒:
$form->submit($request);
die('x');
我们已经尝试在这个提交方法中执行“die()”,一直到return $this;
,运行时间大约为 0.1 秒。似乎在幕后发生了其他事情,我们无法找到问题所在。
运行 XDebug 告诉我们以下信息: Symfony\Component\Form\Form->submit 包含成本最高,主要是这个调用:Symfony\Component\Form\Form->viewToNorm。
我们尝试了以下方法:
设置 realpath_cache_size = 4096k 设置 realpath_cache_ttl=7200 已禁用 XDebug 启用 APC开发或生产环境没有区别。
【问题讨论】:
您确定您没有“陷入”无限循环吗?顺便说一句,使用这个 sn-p 代码:die('x');$form->submit($request);
你永远不会到达 $form->submit($request);希望你知道
感谢您的回复。我们不认为这是一个无限循环,因为实体是在数据库中创建并返回 id。关于 die(),我们试图说明问题依赖于 submit 方法。
您使用的是 Windows 服务器吗?我有一个像这样的神秘问题,其中 Web 服务器试图访问一个不存在的文件系统。考虑使用内置的 php web 服务器进行测试。顺便说一句,秒表组件可以方便地计时。 symfony.com/doc/current/components/stopwatch.html。日志记录也很有效。
您的表单中是否附有DataTransformer
。无论如何,很高兴看到您的表格中发生了什么?你能在FormType
这个不祥的形式上粘贴吗?
感谢您的回复。这是一个 linux 服务器,我会研究一下秒表。
【参考方案1】:
我们通过向表单构建器添加 query_builder 解决了这个问题,现在一切正常。
发件人:
->add('authentication', 'entity', array(
'class' => 'Model\Authentication',
'required' => false,
'multiple' => false,
'property' => 'id',
'invalid_message' => _('No authentication entity found')
))
到:
->add('authentication', 'entity', array(
'class' => 'Model\Authentication',
'required' => false,
'multiple' => false,
'property' => 'id',
'invalid_message' => _('No authentication entity found'),
'query_builder' => function (EntityRepository $er)
return $er
->createQueryBuilder('au')
->select('au')
;
))
【讨论】:
以上是关于Symfony2/Doctrine 提交表单需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2/Doctrine - 与普通 SQL 相关的实体抽象