Добавление коллекций/сущностей ужасно замедляет визуализацию форм
Я использую Конструктор форм Symfony2 для создания формы. Все работает хорошо, но производительность ужасна. Простая форма (всего пара текстовых полей) отображается примерно за 1000 мс, но с полем сущности или коллекции она замедляется примерно до 7500-10000 мс.
Я использую опцию query_builder
(с createQueryBuilder()
), как в этом примере из документации. Добавление коллекции или поля сущности делает приложение ужасно медленным, но я не знаю почему?.
Контроллер занимает большую часть времени, поэтому часть Доктрины (192 запроса) или часть ветки, похоже, не являются проблемой. Удаление шаблона веточки не помогает. Я уже пробовал некоторые улучшения (кэширование), но это тоже не помогло.
Как я могу улучшить (или: посмотреть, в чем именно проблема) производительность этого фрагмента кода?
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
Вам следует использовать преобразователи данных http://symfony.com/doc/current/cookbook/form/data_transformers.html
Не могли бы вы предоставить дополнительную информацию о вашем шаблоне (файлы twig). 2 секунды на рендеринг выглядят подозрительно. А также проверьте это еще раз, отключив ВСЕ профилировщики (например, xdebug).
Если плохая производительность все еще существует (с отключенным профилировщиком), включите ее и попытайтесь найти самую медленную функцию и улучшить ее, Xdebug может помочь вам в этом. Я знаю, что это огромный, медленный и уродливый, но это самый простой способ сделать некоторые измерения, если вы не хотите устанавливать какие-либо другие