Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Cache dużego componentu średnio pomaga?
Forum PHP.pl > Forum > PHP > Frameworki
phpion
Witam,
w serwisie, który aktualnie tworzę, po lewej stronie wyświetlam menu producentów oraz modeli telefonów. Jest tego naprawdę sporo.

Menu to wyświetlam jako komponent (dane pobierane z bazy danych). Samo zapytanie do bazy wykonuje się szybko - średnio w ok. 13ms. Jednak wygenerowanie tegoż menu drastycznie obniża wydajność aplikacji. Z menu telefonów czas tworzenia całego szablonu to ok. 6000ms; jeśli natomiast wyłączę komponent w layoucie to wtedy czas spada do ok. 400ms (przebicie masakryczne).

Menu to nie będzie zbyt często zmieniane więc chciałbym zastosować w tym przypadku cache'owanie. Dodałem odpowiednie wpisy w yml'ach, mam ramkę dookoła listy z telefonami świadczącą o poprawnym cache'owaniu (w katalogu cache również widać przygotowany kod). Jednak nie widzę żadnej różnicy w prędkości działania strony. Dodatkowo w trybie dev widzę, że zapytanie z komponentu nadal jest wykonywane (chyba nie powinno).

Również inna rzecz mnie zaniepokoiła. W statystykach czasu generowania poszczególnych elementów strony widzę, że tworzenie tego komponentu zabiera ok. 80% całego czasu. Sporo :/ Pomyślałem, że jest to wynikiem pętli po wszystkich elementach pobieranych z bazy (łącznie ponad 1200 wierszy). Usunąłem więc całą zawartość kodu szablonu komponentu (zostało tylko pobieranie z bazy, bez wyświetlania) co niestety również w żadnym stopniu nie poprawiło prędkości wczytywania strony.

Czy jest to normalne zjawisko czy może na coś powinienem zwrócić uwagę? Kodów nie daję, bo chyba wszystko jasno zostało opisane.

Pozdrawiam,
pion

PS: korzystam z Symfony 1.1
PS2: przekopiowałem kod z cache i utworzyłem z niego osobnego partiala i wczytuję go zamiast komponentu. Pomaga. Ale dlaczego cache'owanie nie przynosi oczekiwanego rezultatu?
destroyerr
Cytat
Dodatkowo w trybie dev widzę, że zapytanie z komponentu nadal jest wykonywane (chyba nie powinno).

W trybie dev, cache powinien być ustawiony na off, więc każde zapytanie powinno być wykonywane. Tutaj zakładam, że jednak korzystasz z środowiska z załączonym cache'em.

Do rzeczy, działanie jest to normalne, jednak odmienne od tego w wersjach poprzednich. Jest tak, dlatego, że wcześniejsze wersje, przed odpaleniem komponentu sprawdzały czy istnieje jego widok w cache. Jeśli istniał to był serwowany, jeśli nie to był uruchamiany komponent, a widok trafiał do cache i do response. W wersji 1.1 to jednak zostało zmienione. Najpierw jest uruchamiany komponent (jako kontroler), potem inicjalizowany jest widok i renderowany, dopiero metoda render sprawdza czy w cache już odpowiedniu widok istnieje. Jest problem, ponieważ nie podałeś gdzie przetwarzasz to menu, w kontrolerze czy w widoku (w szablonie).
Czy rozwiązanie jest dobre? Trochę dziwne, ale ma też w sobie jaką logike. Skoro nie potrzebujemy wykonywać logiki to po co nam komponent, lepiej użyć partiala. Potrzebne nam logika aplikacji - korzystajmy z komponentu. Tylko tutaj właśnie Twój przykład pokazuje trochę mały minus tego rozwiązania.
Co ja bym na to zaradził? Widzę tutaj fajne miejsce na zastosowanie widgetu, w komponencie (w kontrolerze) tylko stworzysz jego instancje, a w widoku wyrenderujesz. Powinno działać i zadowolić Ciebie.
Jeśli jednak przetwarzasz to menu w szablonie, to... nie mam pojęcia. Podaj wtedy czas dla komponentu i jego partiala winksmiley.jpg

Trochę się rozpisałem, jeśli niejasno to pytaj.
phpion
Dzięki za sporą liczbę informacji.
Komponent wczytuję bezpośrednio w layout.php poprzez:
  1. <?php include_component('mobiletype', 'menu'); ?>

Wyrenderowanie całej strony zajmuje w tym przypadku średnio 7000ms. Jeśli natomiast wczytam gotowego partiala:
  1. <?php include_partial('mobiletype/menuCached'); ?>

to czas skraca się do ok. 800ms.
Aktualnie satysfakcjonuje mnie rozwiązanie z partialem gdyż nie sądzę aby nowe modele telefonu pojawiały się zbyt często.

Cytat(destroyerr @ 16.07.2008, 12:17:29 ) *
W trybie dev, cache powinien być ustawiony na off, więc każde zapytanie powinno być wykonywane. Tutaj zakładam, że jednak korzystasz z środowiska z załączonym cache'em.

Tak, włączyłem cache w dev'ie.
destroyerr
Wyszła nowa wersja, czyli 1.1.1. Cache componentu działa jak w wersjach 1.x. Najpierw sprawdza, czy w cache jest już szablon componentu, jeśli tak to go zwraca, jeśli nie to odpala jego kontroler.
phpion
Dzięki za informację. W wolnej chwili sprawdzę smile.gif
-=Peter=-
możesz w 1.1.0 i tak obejść to dziwne zachowanie i kaszować partiala który includuje dany komponent. Czyli zamiast bezpośrednio includować komponent poprzez include_component w widoku, możesz includować partiala, w którym includujesz komponent (którego docelowo chcesz kaszować), a kaszowanie ustawiasz na partiala. W taki sposób widok nic nie przetwarza, kontroler (component) nie jest uruchamiany, więc powinno być to optymalne rozwiązanie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.