Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Generowanie listy najnowszych pozycji?
Forum PHP.pl > Forum > PHP
WebCM
Chcę wyświetlić listę najnowszych pozycji. Jest 5 typów kategorii: artykuły, pliki, zdjęcia, linki i nowości (każdy typ przechowywany w osobnej tabeli w bazie danych).

Generowanie listy przy każdym odświeżeniu strony może trochę spowolnić skrypt. Przecież można zrobić to raz, a potem wczytywać gotowy fragment kodu HTML!

Zastanawiam się, w jaki sposób tworzyć cache, a właściwie KIEDY. Podczas edycji każdego elementu?

Problem w tym, że system CMS musi obsługiwać wiele języków. Już myślałem, że pobiorę wszystkie najnowsze pozycje (5 zapytań, bo jest 5 typów), przypiszę kod do tablic typu $kod[$jezyk] lub $kod['wszystkie'], a potem zapiszę go do plików - dla każdego języka (po złączeniu tablic, np. $kod['PL'] i $kod['wszystkie']). Jednak to nie takie proste...

Przeczytajcie: http://www.unit1.pl/pb-887

Jak rozwiązać ten problem?
zimi
generalnie z cache'm jakiegokolwiek rodzaju się specjalnie nie bawiłem ale zawsze w mojej świadomości widniało ujęcie problemu w taki sposób:
- przy zmianie bazy, deaktualizujesz cache
- przy renderowaniu strony sprawdzasz czy jest, jeśli go nie ma lub jest zdeaktualizowany to tworzysz a zawartość wysyłasz
AxZx
Cytat(zimi @ 22.09.2008, 00:02:51 ) *
- przy renderowaniu strony sprawdzasz czy jest, jeśli go nie ma lub jest zdeaktualizowany to tworzysz a zawartość wysyłasz


a jak sprawdzasz czy jest zdeaktualizowany ?smile.gif
zimi
Napisałem że ja się za bardzo nie bawiłem z cache-m, moje aplikacje do tej pory nie wymagały takiego rozwiązania
Zatem pytanie jak sprawdzam nie znajdzie swojej odpowiedzi bo jeszcze tego nie robie...
uczę się symfony, przy niej będę robił cache-owanie i jeszcze pewnie kilka innych rzeczy... które w aplikacjach robić się powinno (testy jednostkowe, etc.)

jednak jeśli chodzi o to jakbym to zrobił
deaktualizacja wiążę się bezpośrednio z faktem że plik jest nam do niczego nie potrzebny (przynajmniej tak mi się wydaję) więc deaktualizacja może być po prostu wyrzuceniem pliku, a wtedy sprawdzenie czy cache jest aktualny to po prostu sprawdzenie czy plik istnieje, może się przydać na przykład deaktualizacja co jakiś czas, na tym forum np. odświeżanie ilości odwiedzeń profilu co godzinę... jeśli chcemy coś takiego sprawdzamy datę modyfikacji etc...

Każdy cache przechowujemy oczywiście w osobnym pliku, takie było moje założenie

PS. specem nie jestem ale jeszcze nikt mnie nie skrytykował smile.gif więc rozwiązanie chyba ma ręcę i nogi smile.gif
delfinium
Deaktualizacja cache z reguły odbywa się na dwa sposoby. 1 - jeśli zmieni się coś w bazie 2 - upłynie określony czas. Z odświeżaniem cache z pkt 1 jest więcej problemu, bo trzeba uwzględnić wszystkie pliki w których te dane mogły się znaleźć ale do tego celu stosuje się np. tagi - kiedy tworzysz cache nadajesz mu odpowiednie tagi i potem usuwasz wszystko jak leci co zawiera dany tag - tak ma np. Zend. Pkt 2 jest prostszy bo sprawdzasz datę utworzenia pliku z cachem i jeśli jest większa od określonej to usuwasz i generujesz cache na nowo.
mario_salsa
Ja tworze pliki cache podczas aktualzacji baz danych
pliki te maja strukture tablic wiec korzystanie z nich jest bardzo podobne jak do stosowania zapytan (gdzie tez z reguly otrzymujemy tablice).
WebCM
Twórz cache co X minut
Z odświeżaniem cache do X minut nie ma problemu. W przypadku stron o dużym ruchu, na których nowe elementy pojawiają się średnio raz na dzień, takie rozwiązanie jest raczej nieopłacalne. W przypadku częstych zmian - lista może zaktualizować się nawet po X minutach, więc przez X minut nie będzie aktualna.

Dezaktualizuj cache
Nie wiem, czy usuwanie plików (po każdej zmianie) i tworzenie ich ponownie (gdy trzeba wyświetlić listę) to dobry pomysł, szczególnie że trzeba usunąć tyle plików, ile jest języków.

Aktualizacja cache przy każdej zmianie
To wg mnie najlepszy pomysł, ale gorzej z wykonaniem. Jak już wyjaśniłem, trzeba utworzyć cache dla każdego języka. Zakładając, że istnieje 5 typów kategorii i 3 języki, trzeba wykonać 15 zapytań, chyba że zastosujemy inne konstrukcje SQL, aby osiągnąć cel - tylko jakie? Więcej informacji: http://www.unit1.pl/pb-887

Cytat
kiedy tworzysz cache nadajesz mu odpowiednie tagi i potem usuwasz wszystko jak leci co zawiera dany tag
Możesz wyjaśnić więcej? Chodzi o to, aby w pliku konfiguracyjnym zaznaczyć, że cache jest nieaktualny i trzeba go przebudować? Chyba że dodatkowy plik posłużyłby jako wskaźnik - jeśli jego data jest większa od daty cache...
nospor
Cytat
Nie wiem, czy usuwanie plików (po każdej zmianie) i tworzenie ich ponownie (gdy trzeba wyświetlić listę) to dobry pomysł, szczególnie że trzeba usunąć tyle plików, ile jest języków.
Moim zdaniem to jest właśnie dobre rozwiązanie.
Co ci szkodzi usunąć 5 plików? Przeciez jak dodasz aktualnosc to musisz wyczyscic tylko cache aktualnosci.

Proponuje takie rozwiązanie (opieram się w opisie na mojej klasie - jest w podpisie):
Pobierasz aktualnosci z danego jezyka (np. pl). Patrzysz czy jest w cache obiekt aktualnosci_pl.
Jest? - to go wyswietlasz.
Nie ma? to go tworzysz. przypisujesz go do kategori aktualnosci i wyswietlasz to co stworzyles.
Analogicznie postepujesz dla innego jezyka i dla innych typow.

Teraz zmieniasz cos w aktualnosciach. Czyscisz wiec caly cache z kategorii aktualnosci i juz sie o nic nie martwisz. Wszystko zbuduje sie samo, gdy będzie ktos chcial to wyswietlic
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.