Tworzę sklep internetowy. Mam problem z wydajnością, jeśli używam funkcji gałki "renderuj" zamiast "uwzględnij".Twig: render vs include
Oto kod, który wyświetla się w katalogu produktów: Kontroler
katalogowy:
<?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,
));
}
}
... szablon dla kontrolera katalogowy:
{# 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 %}
... kontrolera produktu:
<?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);
}
}
... proste (ale bardziej skomplikowane w przyszłości) szablon dla kontrolera produktu:
{# src/Acme/StoreBundle/Resources/views/Product/show.html.twig #}
{{ product.name }}
Więc jeśli mogę użyć:
{% include "StoreBundle:Product:show.html.twig" with { product: product } %}
... wszystko ok: 147ms i pamięć 4608Kb.
Ale kiedy potrzebny jest kontroler, aby wyświetlić produkt:
{% render "StoreBundle:Product:show" with { product: product } %#}
... mój skrypt pochłania zbyt dużo czasu i pamięci: 3639ms i pamięć 17664Kb!
Jak zwiększyć prędkość i zmniejszyć zużycie pamięci za pomocą kontrolera?
Czy jesteś w trybie dewelopera lub prod? Różnica może być zaskakująca. –
Użyłem trybu "dev". Kiedy próbowałem "prod" tryb, byłem zaskoczony - aplikacja była bardzo szybka. – George
Dev robi dużo rejestrowania i ma najważniejsze pamięci podręczne wyłączone. Powinieneś spróbować porównać dev i prod z xdebug, aby zobaczyć zmiany zachodzące wewnętrznie.Może to zmniejszyć chęć optymalizacji takich rzeczy w przyszłości. –