![]() |
![]() ![]() |
![]() |
![]()
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 |
|
|
![]()
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 ![]() Trochę się rozpisałem, jeśli niejasno to pytaj. |
|
|
![]()
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:
Wyrenderowanie całej strony zajmuje w tym przypadku średnio 7000ms. Jeśli natomiast wczytam gotowego partiala:
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. 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. |
|
|
![]()
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.
|
|
|
![]()
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ę
![]() |
|
|
![]()
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.
-------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 02:45 |