Добавление коллекций/сущностей ужасно замедляет визуализацию форм


Я использую Конструктор форм Symfony2 для создания формы. Все работает хорошо, но производительность ужасна. Простая форма (всего пара текстовых полей) отображается примерно за 1000 мс, но с полем сущности или коллекции она замедляется примерно до 7500-10000 мс.

Я использую опцию query_buildercreateQueryBuilder()), как в этом примере из документации. Добавление коллекции или поля сущности делает приложение ужасно медленным, но я не знаю почему?.

Profiler Контроллер занимает большую часть времени, поэтому часть Доктрины (192 запроса) или часть ветки, похоже, не являются проблемой. Удаление шаблона веточки не помогает. Я уже пробовал некоторые улучшения (кэширование), но это тоже не помогло.

Как я могу улучшить (или: посмотреть, в чем именно проблема) производительность этого фрагмента кода?

Author: Stephan Vierkant, 2014-01-17

3 answers

То, как вы используете поле сущности формы и коллекцию, плохо, и из-за этого может возникнуть проблема с производительностью.

Сначала попробуйте удалить запросы, которые вы пишете в своих формах, это неподходящее место, особенно для ваших запросов, которые используются по умолчанию, поэтому нет необходимости их переопределять.

Таким образом, вы можете сделать очень просто вот так:

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 и указать ему метод репозитория ( Пример здесь), это правильный способ сделать.

Для коллекции у вас есть полный пример в кулинарной книге, я надеюсь, что это поможет вам.

Если это не решит вашу проблему, попробуйте настроить xhprof, это даст вам более подробный график вашего запроса и объяснит, почему это занимает так много времени: Пакет Xhprof Example of Xhprof

 2
Author: lenybernard, 2014-01-19 23:14:18

Вам следует использовать преобразователи данных http://symfony.com/doc/current/cookbook/form/data_transformers.html

 2
Author: lostboy, 2014-07-28 18:37:10

Не могли бы вы предоставить дополнительную информацию о вашем шаблоне (файлы twig). 2 секунды на рендеринг выглядят подозрительно. А также проверьте это еще раз, отключив ВСЕ профилировщики (например, xdebug).

Если плохая производительность все еще существует (с отключенным профилировщиком), включите ее и попытайтесь найти самую медленную функцию и улучшить ее, Xdebug может помочь вам в этом. Я знаю, что это огромный, медленный и уродливый, но это самый простой способ сделать некоторые измерения, если вы не хотите устанавливать какие-либо другие

 1
Author: Dmitry, 2014-01-21 20:11:39