添加集合/实体使表单渲染变得非常缓慢

5
我正在使用Symfony2表单构建器制作一个表单。一切都很顺利,但性能非常差。一个简单的表单(只有几个文本字段)需要大约1000毫秒来呈现,但是如果使用实体或集合字段,则会变慢到大约7500-10000毫秒。
我正在使用query_builder(使用createQueryBuilder())选项,例如文档中的此示例。添加集合或实体字段会使应用程序变得非常缓慢,但我不知道原因。
控制器占用了大部分时间,因此Doctrine部分(192个查询)或Twig部分似乎不是问题所在。去除Twig模板也没有帮助。我已经尝试过一些改进(缓存),但也没有帮助。
我该如何提高(或:确定问题所在)这段代码的性能?

@StephanVierkant 你的表中有多少条记录(每个实体类型)? - Alexey B.
@forgottenbas:Prices表中大约有20条记录,Values表中有300条记录。 - Stephan Vierkant
1
你解决了你的问题吗?我猜你禁用了Xdebug分析,这会大大降低Symfony2的性能,它只应在调试时激活,并且根据执行的内容增加100%到1000%的性能降级。 - COil
@createproblem 我正在使用CentOS。 - Stephan Vierkant
@COil 还没有。禁用 xdebug 可以提高 50% 的性能,但渲染仍需要约 4500 毫秒。 - Stephan Vierkant
显示剩余9条评论
3个回答

2

您的表单实体字段和集合的处理方式不佳,可能会导致性能问题。

首先尝试移除您在表单中编写的查询,这不是正确的位置,特别是对于默认查询,因此无需覆盖它们。

所以您可以非常简单地像这样做:

public function buildForm(FormBuilderInterface $builder, array $options)
{        

    $builder
        ->add('ref', 'text')
        ->add('title', 'text')
        ->add('lessor', 'entity', array(
            'class' => 'MyCompany\AppBundle\Entity\Lessor',
            'property' => 'title')
        )
        ->add('type', 'entity', array(
            'class' => 'MyCompany\AppBundle\Entity\ObjectType',
            'property' => 'title')
        )
        ->add('prices', 'collection', array(
            'type'      => new ObjectItemPriceType()
        ))
        ->add('values', 'collection', array(
            'type'      => new ObjectValueTextType()
            'allow_add' => true,
            'prototype' => true
        ))
        ->add('save', 'submit');
}

了解有关实体表单类型的更多信息

如果您需要传递一些选择(例如您想要做的),则必须设置query_builder选项并提供一个存储库方法(此处为示例),这是正确的方法。

对于集合,您可以在cookbook中找到完整的示例,希望它能帮助您。

如果这没有解决您的问题,请尝试设置xhprof,它将为您的请求提供更详细的图形以及为什么需要这么长时间:Xhprof bundle Example of Xhprof


感谢您的回答!不幸的是,更改代码并没有帮助。删除'options' => array('data_class' => ....)会导致错误:"表单的视图数据应该是标量、数组或\ArrayAccess的实例"在性能方面,选择和实体之间没有区别。 - Stephan Vierkant
好的,你能把你的项目上传到 Github 仓库中吗?这样我们就可以测试它了。谢谢。 - lenybernard
很高兴社区为你颁发了额外的积分。我认为,这种图表是对于性能调优来说毫无用处的调用图表的极好例子。大红框没有多少解释价值,而且全部都是CPU时间,没有I/O时间。黄色框是通往无处的“热路径”,整个事情嵌入了一堆白色框和没有信息价值的箭头的意大利面条式结构中。一次单独的堆栈快照(或几个)就可以告诉实际问题所在。请原谅我的言辞有点激烈 :) - Mike Dunlavey


1

你能提供有关模板(twig文件)的更多信息吗?渲染2秒似乎有些可疑。还要检查是否禁用了任何分析器(例如xdebug)。

如果性能仍然不佳(已禁用分析器),请启用它并尝试查找最慢的函数并改进它,Xdebug可以帮助您完成此操作。我知道它很庞大、缓慢和丑陋,但如果您不想安装其他软件,这是进行一些测量的最简单方法。


谢谢!禁用xdebug可以提高50%的性能,但页面仍需要约4500毫秒才能加载。 - Stephan Vierkant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接