Symfony2 и Twig рендерит проблемы с производительностью - PullRequest
8 голосов
/ 25 марта 2012

Как и в этой теме , у меня возникла проблема с производительностью в режиме разработки при добавлении тега «render» ветки в мое приложение (соответствующая документация: Встраивание контроллеров ).

Без этого тега рендеринга мои страницы генерируются менее чем за 70 мс.С тегом рендеринга это составляет не менее 170 мс.И каждый тег рендеринга, добавленный в приложение, увеличивает генерацию страницы на 100 мс (что МНОГО: почему нормальная страница запускается за 60 мс, а тег рендеринга - за 100 мс?).Мне может понадобиться 4 или 5 из них на каждой странице моего приложения, так что это будет означать не менее 500 мс для каждой страницы в режиме разработки.

Я полностью понимаю, что в режиме prod проблем нет, но этоявно не комфортно в разработке.Итак, знает ли кто-нибудь способ избавиться от каких-либо бесполезных вызовов, журналов или кода при использовании тега «render» в режиме разработки?

Ответы [ 5 ]

9 голосов
/ 26 марта 2012

Одной из моих любимых функций в Symfony является тег render, встраивание вызовов контроллера. Профилировщик добавляет много накладных расходов к каждому вызову контроллера, не только скорость, но и использует много памяти. У вас есть несколько вариантов, чтобы ускорить его.

Профилировщик по умолчанию записывает все данные в базу данных sqlite. IIRC sqlite не допускает параллельные вставки, поэтому каждый запрос должен ждать своей очереди для доступа к БД для сброса сборщиков данных. Вы можете использовать свою базу данных разработки (MySQL или что вы используете), чтобы сохранить данные профилировщика. Год назад я многое приобрел с точки зрения скорости.

Вы также можете отключить профилировщик для вложенных запросов или использовать профилировщик только в случае возникновения исключения. См. справочник по конфигурации фреймворка для получения полной информации.

# config_dev.yaml
framework:
    profiler:
        only_exceptions:      false
        only_master_requests: false
        dsn:                  sqlite:%kernel.cache_dir%/profiler.db
8 голосов
/ 26 марта 2012

Я объяснил это всего 10 часов назад. Короче говоря: переход на расширения Twig.

6 голосов
/ 25 марта 2012

Вы можете переместить логику контроллера в службу и ссылаться на нее как на глобальную переменную ветки, а затем включить шаблон, отображаемый контроллером.

См. https://stackoverflow.com/a/13245994/982075 для инструкций.

3 голосов
/ 22 января 2013

Выбор зависит от вашего приложения.Я считаю, что наиболее практичными являются следующие способы:

1) Используйте тег render для тяжелых визуализированных шаблонов и используйте библиотеку hinclude для их асинхронной загрузки.Это очень полезно, когда каждый отображаемый шаблон является «медленным» сам по себе (например, множество соединений с БД, большие тексты и т.Это очень быстрое решение для обычных случаев.

0 голосов
/ 30 июля 2014

Я бы также следовал совету Эльнура с расширениями веточек. Альтернативой может быть использование Sonata Block Bundle: http://sonata -project.org / bundles / block / master / doc / index.html . Накладные расходы на подзапрос с блоком Sonata составляют около 7 мс.

...