Tôi đang tạo một cửa hàng trực tuyến. Tôi gặp vấn đề về hiệu suất nếu tôi sử dụng chức năng xoay "render" thay vì "include".Twig: render vs include
Dưới đây là đoạn code mà sẽ hiển thị một danh mục sản phẩm:
Danh mục điều khiển:
<?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,
));
}
}
... mẫu cho catalogue điều khiển:
{# 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 %}
... điều khiển sản phẩm:
<?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);
}
}
... đơn giản (nhưng phức tạp hơn trong tương lai) mẫu cho bộ điều khiển sản phẩm:
{# src/Acme/StoreBundle/Resources/views/Product/show.html.twig #}
{{ product.name }}
Vì vậy, nếu tôi sử dụng:
{% include "StoreBundle:Product:show.html.twig" with { product: product } %}
... tất cả ok: 147ms và bộ nhớ 4608Kb.
Nhưng khi tôi cần một bộ điều khiển để hiển thị các sản phẩm:
{% render "StoreBundle:Product:show" with { product: product } %#}
... kịch bản của tôi tiêu thụ quá nhiều thời gian và bộ nhớ: 3639ms và bộ nhớ 17664Kb!
Làm cách nào để tăng tốc độ và giảm mức tiêu thụ bộ nhớ bằng bộ điều khiển?
Bạn có ở chế độ dev hoặc prod không? Sự khác biệt có thể gây ngạc nhiên. –
Tôi đã sử dụng chế độ "dev". Khi tôi thử chế độ "prod", tôi đã rất ngạc nhiên - ứng dụng này rất nhanh. – George
Dev thực hiện rất nhiều việc ghi nhật ký và có các bộ đệm quan trọng nhất bị vô hiệu hóa. Bạn nên cố gắng so sánh dev và prod với xdebug để xem các thay đổi đang diễn ra trong nội bộ.Nó có thể làm giảm sự thôi thúc để tối ưu hóa những thứ như vậy trong tương lai. –