Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] Cache dużego componentu średnio pomaga?
phpion
post 16.07.2008, 08:49:04
Post #1





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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?

Ten post edytował phpion 16.07.2008, 08:58:34
Go to the top of the page
+Quote Post
destroyerr
post 16.07.2008, 11:17:29
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
phpion
post 16.07.2008, 11:49:14
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
destroyerr
post 2.08.2008, 10:15:27
Post #4





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
phpion
post 2.08.2008, 10:49:13
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Dzięki za informację. W wolnej chwili sprawdzę smile.gif
Go to the top of the page
+Quote Post
-=Peter=-
post 2.08.2008, 19:23:08
Post #6





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 02:45