Zweig: render vs enthalten

Erstelle ich einen online-Shop.
Ich habe ein performance-problem, wenn ich den Zweig mit der Funktion "Rendern" anstatt "include".

Hier ist der code, der zeigt, dass ein Produkt-Katalog:

Katalog-controller:

<?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,
        ));
    }
}

... Vorlage für Katalog-controller:

{# 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 %}

... Produkt-controller:

<?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);
    }
}

... einfach (aber komplizierter in der Zukunft) - Vorlage für die Produkt-controller:

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

So, wenn ich:

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

...alles ok: 147ms und 4608Kb Speicher.

Aber wenn ich einen controller um das Produkt anzuzeigen:

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

...mein script verbraucht zu viel Zeit und Speicher: 3639ms und 17664Kb Speicher!!!

Wie die Erhöhung der Geschwindigkeit und der Speicherverbrauch durch die Verwendung des Controllers?

  • Sind Sie im dev oder prod-Modus? Der Unterschied ist überraschend.
  • Ich habe die "dev" - Modus. Als ich versuchte, "prod" - Modus, ich war überrascht - der Antrag war sehr schnell.
  • Dev hat eine Menge von Protokoll-und hat die wichtigsten caches deaktiviert. Sie sollten versuchen, zu vergleichen dev und prod mit xdebug, um zu sehen, die Art von Veränderungen, intern. Es kann reduzieren den Drang zu optimieren solche Dinge in der Zukunft.
InformationsquelleAutor George | 2012-01-31
Schreibe einen Kommentar