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 Doctrine2 获取所有表

Symfony2/Doctrine - 与普通 SQL 相关的实体抽象

Symfony2,Doctrine OneToOne 关系

Symfony2:学说“找不到驱动程序”

如何从 Symfony2 和 Doctrine2 中的一个点保存和检索纬度和经度

Symfony2\Doctrine - 检索用户角色