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

时间:2014-01-17 14:26:42

标签: php performance symfony doctrine-orm profiling

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

我正在使用query_builder(带createQueryBuilder())选项,例如文档中的this example。添加collection或实体字段会使应用程序变得很慢,但我不知道为什么。

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

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

3 个答案:

答案 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');
}

详细了解entity form type here

如果你需要传递一些像你想做的选择,你必须设置query_builder选项并给它一个存储库方法(Example here),这是正确的方法。

对于集合,您在cookbook中有一个完整的示例,我希望它能为您提供帮助。

如果它无法解决您的问题,请尝试设置xhprof,它会为您提供更详细的请求图表以及为什么需要花费这么多时间:Xhprof bundle Example of Xhprof

答案 1 :(得分:2)

答案 2 :(得分:1)

您能否提供有关模板的更多信息(树枝文件)。渲染2秒看起来很可疑。 并使用已禁用的ANY分析器(例如xdebug)再次检查它。

如果仍然存在不良性能(使用禁用的探查器)启用它并尝试找到最慢的功能并改进它,Xdebug可以帮助您。我知道它是巨大的,缓慢的和丑陋的但如果你不想安装任何其他的话,它是进行一些测量的最简单方法