Twig: render vs include

Я создаю интернет-магазин. У меня проблема с производительностью, если я использую функцию твинга «render» вместо «include».

Вот код, который отображает каталог продукта:

controller каталога:

getDoctrine() ->getRepository('StoreBundle:Product') ->createQueryBuilder('product') ->select('partial product.{id, token, name}') ->innerJoin('product.categoryRelation', 'categoryRelation') ->where('categoryRelation.category = :category_id'); $qb->setParameters(array( 'category_id' => $category->getId(), )); $products = $qb->getQuery() ->getResult(); return $this->render('StoreBundle:Product\Catalog:product.html.twig', array( 'category' => $category, 'products' => $products, )); } } 

… шаблон для controllerа каталога:

 {# src/Acme/StoreBundle/Resources/views/Product/Catalog/product.html.twig #} {% extends 'AcmeDemoBundle::layout.html.twig' %} {% block content %} 

{{ category.name }}

    {% for product in products %}
  • {#% render "StoreBundle:Product:show" with { product: product } %#} {% include "StoreBundle:Product:show.html.twig" with { product: product } %}
  • {% endfor %}
{% endblock %}

… controller продукта:

  $product); } } 

… простой (но более сложный в будущем) шаблон для controllerа продукта:

 {# src/Acme/StoreBundle/Resources/views/Product/show.html.twig #} {{ product.name }} 

Поэтому, если я использую:

 {% include "StoreBundle:Product:show.html.twig" with { product: product } %} 

… все нормально: 147 мс и 4608 Кб памяти.

Но когда мне нужен controller для отображения продукта:

 {% render "StoreBundle:Product:show" with { product: product } %#} 

… мой скрипт потребляет слишком много времени и памяти: 3639ms и 17664Kb памяти!

Как увеличить скорость и сократить потребление памяти с помощью controllerа?

    Каждый вызов рендеринга порождает новый запрос с проблемой деgradleации производительности, которую вы описываете. Я не думаю, что вы можете с этим справиться, но с помощью esi-кеширования можно кэшировать отдельные fragmentы, исходящие из вызовов визуализации. В противном случае вы можете попытаться пересмотреть свою логику, чтобы уменьшить использование вызовов рендеринга.

    Исправьте меня, если я ошибаюсь, но основная идея заключается в том, что в основном «копировать-вставляет» его содержимое вместо команды.

    В то время как команда render должна сначала создать controller, инициализировать его, запустить соответствующую функцию и т. Д. Итак, кто знает, какая тяжелая артиллерия скрыта внутри classов этого controllerа или родителя, конструкторов и т. Д.?

    Также помните, что даже включены шаблоны. Таким образом, вы даже можете получить рекурсии или что-то подобное при рендеринге с ветки. Лично я стараюсь избегать визуализации чего-либо вне возврата controllerа.

    Плюс, как упоминалось Луи-Филиппом Хубердо в комментариях, среда для разработчиков может резко отличаться от режима prod из-за разных вариантов и ведения журнала.

    Что касается советов, попробуйте избегать ввода логики в свои controllerы или попробуйте использовать статические объекты, которые часто используются в controllerах для повторного использования, а не для создания новых. И выводить данные только из controllerов

    Interesting Posts

    angularjs – ng-switch не привязывает ng-модель

    Использование HashSet в C # 2.0, совместимое с 3.5

    MongoDB против Кассандры

    Какие недостатки существуют при использовании памяти, которая быстрее, чем у материнской платы?

    Как реализовать Yii2 Modal Dialog на кнопке просмотра и обновления Gridview?

    Как платформа Java независима, когда ей нужна JVM?

    Какое обоснование для fread / fwrite принимает размер и считается аргументом?

    Нестатический член const не может использовать оператор присваивания по умолчанию

    Свойство ContextMenuStrip.Owner null При извлечении из вложенного ToolStripMenuItem

    Как получить частоты каждого значения в БПФ?

    Windows 7 – 64 Компьютер неожиданно отключается

    Msgstr "не найдено достоверных источников sudoers, исключая" ​​ошибку, в то время как chmodding / var / www

    добавление пакета RMySQL в R завершается с ошибкой (в Windows)?

    Каковы хорошие кандидаты на базовый class controllerа в ASP.NET MVC?

    Как настроить PuTTY так, чтобы Home / End / PgUp / PgDn работал правильно в bash?

    Давайте будем гением компьютера.