我正在使用Symfony2 Form Builder制作表单。一切都运作良好,但表现很糟糕。一个简单的表单(只是几个文本字段)在大约1000毫秒内渲染,但是对于实体或集合字段,它会减慢到大约7500-10000毫秒。
我正在使用query_builder
(带createQueryBuilder()
)选项,例如文档中的this example。添加collection或实体字段会使应用程序变得很慢,但我不知道为什么。
Controller占用大部分时间,因此Doctrine部分(192个查询)或Twig部分似乎不是问题。剥离树枝模板没有帮助。我已经尝试了一些改进(缓存),但这也无济于事。
如何改进(或者:确切地说明问题在哪里)这段代码的性能?
答案 0 :(得分: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选项并给它一个存储库方法(Example here),这是正确的方法。
对于集合,您在cookbook中有一个完整的示例,我希望它能为您提供帮助。
如果它无法解决您的问题,请尝试设置xhprof,它会为您提供更详细的请求图表以及为什么需要花费这么多时间:Xhprof bundle
答案 1 :(得分:2)
答案 2 :(得分:1)
您能否提供有关模板的更多信息(树枝文件)。渲染2秒看起来很可疑。 并使用已禁用的ANY分析器(例如xdebug)再次检查它。
如果仍然存在不良性能(使用禁用的探查器)启用它并尝试找到最慢的功能并改进它,Xdebug可以帮助您。我知道它是巨大的,缓慢的和丑陋的但如果你不想安装任何其他的话,它是进行一些测量的最简单方法