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

Ste*_*ant 5 php performance profiling symfony doctrine-orm

我正在使用Symfony2表单生成器来制作表单.一切都运作良好,但表现很糟糕.一个简单的表单(只是几个文本字段)在大约1000毫秒内呈现,但是对于实体或集合字段,它会减慢到大约7500-10000毫秒.

我正在使用query_builder(with createQueryBuilder())选项,就像文档中的这个例子一样.添加集合或实体字段会使应用程序变得非常缓慢,但我不知道为什么.

探查 Controller占用大部分时间,因此Doctrine部分(192个查询)或Twig部分似乎不是问题.剥离树枝模板没有帮助.我已经尝试了一些改进(缓存),但这也没有帮助.

如何改进(或者:确切地说明问题的确切位置)这段代码的性能?

len*_*ard 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');
}
Run Code Online (Sandbox Code Playgroud)

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

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

对于收藏,您在食谱中有完整的示例,希望对您有所帮助。

如果它不能解决您的问题,请尝试设置 xhprof,它会给您一个更详细的请求图表以及为什么需要这么多时间:Xhprof bundle Xhprof 示例