2012-03-25 4 views
8

Giống như in this topic, tôi có vấn đề về hiệu suất ở chế độ nhà phát khi thêm thẻ "render" trong ứng dụng của tôi (tài liệu liên quan: Embedding controllers).Symfony2 và Twig hiển thị các vấn đề về hiệu suất

Nếu không có thẻ kết xuất này, các trang của tôi sẽ được tạo dưới 70 mili giây. Với thẻ kết xuất, tối thiểu 170 mili giây. Và mỗi thẻ kết xuất được thêm vào trong ứng dụng sẽ làm tăng việc tạo trang thêm 100 mili giây (đó là A LOT: tại sao một trang bình thường chạy trong 60 mili giây và thẻ kết xuất trong 100 mili giây?). Tôi có thể cần 4 hoặc 5 trong số chúng trên mỗi trang trong ứng dụng của tôi, vì vậy điều đó có nghĩa là ít nhất 500 ms cho mỗi trang ở chế độ nhà phát triển.

Tôi hoàn toàn hiểu rằng không có vấn đề gì trong chế độ prod, nhưng rõ ràng là không thoải mái khi phát triển. Vì vậy, không ai biết cách nào để loại bỏ bất kỳ cuộc gọi, nhật ký hoặc mã vô dụng nào trong khi sử dụng thẻ "render" trong chế độ dev?

Trả lời

8

Tôi có explained chỉ 10 giờ trước. Dài câu chuyện ngắn: di chuyển đến phần mở rộng Twig.

+2

Trong trường hợp này, việc tạo một dịch vụ cho logic điều khiển là IMHO tốt hơn. Nếu logic điều khiển có hoạt động db thì tôi nghĩ tốt hơn là không chuyển logic sang chức năng twig. Tạo một dịch vụ riêng biệt cũng đảm bảo khả năng sử dụng lại nếu bộ điều khiển nhúng có tuyến đường được đính kèm và có thể được gọi độc lập. –

+0

Không có gì ngăn bạn gọi dịch vụ từ tiện ích mở rộng Twig. Trong thực tế, đó là những gì tôi làm. Nó không phải là một vấn đề này-VS-đó. Phần mở rộng Twig của tôi chỉ gọi các hành động của các bộ điều khiển được định nghĩa là các dịch vụ. Những hành động đó có thể tái sử dụng mà không cần phần mở rộng Twig. –

+1

Cũng dịch vụ cũng có thể được tiếp xúc với cành bằng cách thêm twig biến toàn cục trong 'app/config.yml'. Chỉ là cách khác nhau để hoàn thành mọi thứ. Không có gì để tranh luận về thực sự :). –

6

Bạn có thể di chuyển logic điều khiển của mình đến một dịch vụ và tham chiếu nó dưới dạng biến toàn cục xoắn và sau đó bao gồm mẫu được bộ điều khiển hiển thị.

Xem https://stackoverflow.com/a/13245994/982075 để được hướng dẫn.

8

Một trong những tính năng yêu thích của tôi trong symfony là thẻ kết xuất, nhúng các cuộc gọi điều khiển. Profiler cho biết thêm rất nhiều chi phí cho mỗi cuộc gọi điều khiển, mặc dù không chỉ tốc độ mà còn sử dụng rất nhiều bộ nhớ. Bạn có một vài tùy chọn để tăng tốc độ.

Trình lược tả ghi mọi dữ liệu vào cơ sở dữ liệu sqlite theo mặc định. IIRC sqlite không cho phép chèn song song, vì vậy mọi yêu cầu phải chờ đến lượt của chúng để truy cập vào db để xóa các bộ thu thập dữ liệu. Bạn có thể sử dụng db phát triển của bạn (mysql hoặc bất cứ thứ gì bạn sử dụng) để lưu trữ dữ liệu profiler. Một năm trước, tôi đã đạt được rất nhiều điều này về mặt tốc độ.

Bạn cũng có thể tắt trình thu thập thông tin cho các yêu cầu phụ hoặc chỉ sử dụng trình lược tả khi có ngoại lệ. Xem the framework config reference để biết chi tiết đầy đủ.

# config_dev.yaml 
framework: 
    profiler: 
     only_exceptions:  false 
     only_master_requests: false 
     dsn:     sqlite:%kernel.cache_dir%/profiler.db 
+0

Tôi đã sử dụng hàm render_esi(); trong trường hợp này giải pháp @ m2mdas không khả thi. – lrkwz

+0

Đó là một mẹo thú vị để chắc chắn :-) – MauganRa

2

Lựa chọn tùy thuộc vào ứng dụng của bạn. Tôi tin rằng những cách thực tế nhất là:

1) Sử dụng thẻ render cho các mẫu được hiển thị nặng và sử dụng thư viện hinclude để tải chúng theo cách không đồng bộ. Điều này rất hữu ích khi mỗi mẫu được hiển thị là "chậm" (ví dụ: nhiều kết nối db, văn bản lớn, v.v.).

2) Thực hiện theo đề xuất của m2mdas. Đây là một giải pháp rất nhanh cho các trường hợp thông thường.