Estoy creando una tienda en línea. Tengo un problema de rendimiento si uso la función twig "renderizar" en lugar de "incluir".Twig: render vs include
Aquí está el código que muestra un catálogo de productos: Controlador
catálogo:
<?php
// src/Acme/StoreBundle/Controller/Product/Catalog.php
namespace Acme\StoreBundle\Controller\Product;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
class CatalogController extends Controller
{
/**
* @Template()
*/
public function productAction(\Acme\StoreBundle\Entity\Product\Category $category)
{
$qb = $this->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,
));
}
}
... plantilla para controlador de catálogo:
{# src/Acme/StoreBundle/Resources/views/Product/Catalog/product.html.twig #}
{% extends 'AcmeDemoBundle::layout.html.twig' %}
{% block content %}
<h1>{{ category.name }}</h1>
<ul>
{% for product in products %}
<li>
{#% render "StoreBundle:Product:show" with { product: product } %#}
{% include "StoreBundle:Product:show.html.twig" with { product: product } %}
</li>
{% endfor %}
</ul>
{% endblock %}
... controlador de producto:
<?php
// src/Acme/StoreBundle/Controller/Product.php
namespace Acme\Enter\StoreBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Enter\StoreBundle\Entity\Product;
class ProductController extends Controller
{
/**
* @Template()
*/
public function showAction(Product $product)
{
return array('product' => $product);
}
}
... plantilla simple (pero más compleja en el futuro) para el controlador del producto:
{# src/Acme/StoreBundle/Resources/views/Product/show.html.twig #}
{{ product.name }}
Así que si uso:
{% include "StoreBundle:Product:show.html.twig" with { product: product } %}
... todo muy bien: 147ms y la memoria 4608Kb.
Pero cuando necesito un controlador para ver el producto:
{% render "StoreBundle:Product:show" with { product: product } %#}
... mi guión consume demasiado tiempo y la memoria: 3639ms y la memoria 17664Kb!
Cómo aumentar la velocidad y reducir el consumo de memoria mediante el uso del controlador?
¿Está en modo dev o prod? La diferencia puede ser sorprendente. –
Utilicé el modo "dev". Cuando traté de modo "prod", me sorprendió, la aplicación fue muy rápida. – George
Dev realiza una gran cantidad de registros y tiene caches más importantes deshabilitados. Intente comparar dev y prod con xdebug para ver el tipo de cambios que se producen internamente.Podría reducir el impulso de optimizar tales cosas en el futuro. –