2012-03-25 21 views
8

Podobnie jak w przypadku in this topic, mam problem z wydajnością w trybie deweloperskim podczas dodawania tagu "renderowanie" gałązki w mojej aplikacji (powiązana dokumentacja: Embedding controllers).Symfony2 i Twig renderują problemy z wydajnością

Bez tego tagu renderowania moje strony są generowane w czasie krótszym niż 70 ms. Z tagiem renderowania wynosi co najmniej 170 ms. A każdy tag renderowania dodany w aplikacji zwiększa generowanie strony o 100 ms (co jest DUŻO: dlaczego normalna strona działa w ciągu 60 ms, a tag renderowania w 100 ms?). Mogę potrzebować 4 lub 5 z nich na każdej stronie mojej aplikacji, co oznaczałoby co najmniej 500 ms dla każdej strony w trybie deweloperskim.

Całkowicie rozumiem, że nie ma problemu w trybie prod, ale wyraźnie nie jest to wygodne w rozwoju. Czy ktoś wie, w jaki sposób można pozbyć się niepotrzebnych połączeń, logów lub kodu podczas używania tagu "render" w trybie deweloperskim?

Odpowiedz

8

Mam explained to zaledwie 10 godzin temu. Krótko mówiąc: przenieś do rozszerzeń Twig.

+2

W tym przypadku tworzenie usługi dla logiki sterownika jest lepsze IMHO. Jeśli logika sterownika ma operację db, to myślę, że lepiej nie przesuwać logiki do funkcji gałązki. Utworzenie oddzielnej usługi zapewnia również res-użyteczność, jeśli wbudowany kontroler ma przypisaną trasę i można ją wywołać niezależnie. –

+0

Nic nie powstrzyma cię od wywoływania usług z rozszerzenia Twig. W rzeczywistości to właśnie robię. To nie jest ten VS - ten problem. Rozszerzenia My Twig po prostu wywołują akcje kontrolerów zdefiniowanych jako usługi. Te akcje można ponownie używać bez rozszerzeń Twig. –

+1

Cóż, usługa może być również narażona na działanie twig poprzez dodanie globalnej zmiennej twig w 'app/config.yml'. Po prostu inny sposób realizacji rzeczy. Nie ma się co o to kłócić :). –

6

Możesz przenieść logikę kontrolera do usługi i określić ją jako globalną zmienną gałązki, a następnie dołączyć szablon renderowany przez kontroler.

Aby uzyskać instrukcje, patrz https://stackoverflow.com/a/13245994/982075.

8

Jedną z moich ulubionych funkcji w symfony jest tag renderujący, osadzający wywołania kontrolera. Profiler dodaje wiele kosztów do wszystkich wywołań kontrolera, nie tylko szybkości, ale wymaga dużej ilości pamięci. Masz kilka opcji, aby przyspieszyć.

Profiler zapisuje wszystkie dane w bazie danych sqlite domyślnie. IIRC sqlite nie zezwala na wstawianie równoległe, więc każde żądanie musi czekać na swoją kolej, aby uzyskać dostęp do bazy danych, aby opróżnić kolektory danych. Możesz użyć bazy deweloperskiej (mysql lub jakiejkolwiek innej) do zachowania danych profilera. Rok temu wiele zyskałem pod tym względem prędkości.

Można również wyłączyć profiler dla żądań podrzędnych lub używać profilera tylko w przypadku wystąpienia wyjątku. Aby uzyskać szczegółowe informacje, patrz the framework config reference.

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

Miałem prbl przy użyciu render_esi(); w tym przypadku rozwiązanie @ m2mdas nie jest możliwe. – lrkwz

+0

To ciekawa sztuczka na pewno :-) – MauganRa

2

Wybór zależy od zastosowania. Uważam, że najbardziej praktycznymi sposobami są:

1) Użyj znacznika render dla ciężkich renderowanych szablonów i użyj biblioteki hinclude, aby załadować je w sposób asynchroniczny. Jest to bardzo pomocne, gdy każdy z wyświetlanych szablonów jest sam "wolny" (np. Wiele połączeń db, duże teksty itp.).

2) Wykonaj czynności zgodnie z propozycją m2mdas. Jest to bardzo szybkie rozwiązanie dla typowych przypadków.

Powiązane problemy