Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]System cacheujacy oparty na plikach
Forum PHP.pl > Forum > Przedszkole
elmozaur
Witajcie.
Chcialbym napisac prosty system cacheujacy dla pewnego serwisu.
Zamysl jest taki, aby wprowadzane newsy zapisywane byly jako pliki w katalogu cache.
Uzytkownicy przy wejsciu na strone czytali by pliki zawierajace newsy bez koniecznosci laczenia sie z baza.

Powstaje jednak pytanie:
jesli serwis ma obecnie troche ponad 10000 wpisow/newsow plus ich tlumaczenia w 4 jezykach daje to ponad 40000 plikow.
Czy serwery nie nie beda robily problemu z tak duza iloscia plikow w jednym katalogu ? Nawet 1000 plikow to duzo i zastanawiam sie nad wydajnoscia takiego rozwiazania.

Za wszelkie info z gory dziekuje i pozdrawiam
Grzegorz
wookieb
Przy większej ilości plików w katalogu ich znalezienie zwalnia.
Rozwiązaniem jest... Numeracja plików cache Np. wpis_[id_wpisu] gdzie następnie rozbijamy id_wpisu po 3 znaki (można zrobić matematycznie jeżeli chcesz mieć więcej niż 1000 plików w jednym katalogu.
Tak więc numer 3425 rozbijamy na 3/425, 241244 na 241/244, 5 na 0/5

Dzięki temu ścieżka do takiego pliku wpis_241254 wyglądałaby tak

cache/wpis/241/254
Moja funkcja, która realizuje rozbicie liczby na numery katalogów to
  1. /**
  2. * Rozbija liczbę na nazwę katalogu w cache.
  3. * Maksymalna liczba możliwych kombinacji określona jest wzorem $maxFiles ^ $depthLevel
  4. * @param int $num liczba do rozbicia
  5. * @param int $depthLevel liczba zagłębień katalogów, przy 2 dla 5 wyjdzie 0/0/5
  6. * @param int $maxFile maksymalna liczba plików w katalogu
  7. * @return string
  8. */
  9. function getNumPath($num, $depthLevel=1, $maxFiles = 1000)
  10. {
  11. $dir = array();
  12. $tmpNum=$num;
  13. // algorytm rozbijania na czesci
  14. for($i=$depthLevel; $i>0; $i--)
  15. {
  16. $w=floor($tmpNum/pow($maxFiles, $i));
  17. $tmpNum-=($w*pow($maxFiles, $i));
  18.  
  19. $dir[]=$w;
  20. }
  21. return implode('/', $dir).'/'.$tmpNum;
  22. }

BARDZO WAŻNA UWAGA! Zmiana choć jednego z dwóch ostatnich parametrów będzie wymagała wyczyszczenia cache albo przepisanie plików do odpowiednich ścieżek

Jest jeszcze jedno ale... Jeżeli newsów nie wykorzystujesz na innych stronach to lepiej zapisywać po prostu html bądź cała stronę. Analogicznie z innymi elementami.
elmozaur
pomyslowe rozwiazanie.
Pilsener
I użytkownicy wyświetlają te wszystkie 4k newsów w n językach? Ja bym Ci radził zrobić cache tylko wtedy, jeśli są użytkownicy. Działać ma to mniej więcej tak:
1. Ktoś wchodzi do newsa 1234
2. Skrypt sprawdza, czy jest cache tego newsa
3. Jeśli nie ma, to wyświetla z bazy i tworzy cache na tej podstawie
4. Jeśli jest, to wyświetla i zmienia czas pliku
5. Ustawiasz czas przeterminowania cache powiedzmy na 30 dni i wywalasz te pliki, które w tym czasie nie miały użytkowników, czyli te z czasem ostatniej operacji większym niż 30 dni.

Nie ma sensu robić cache strony, na którą być może nikt nigdy nie wejdzie smile.gif
Riklaunim
Plikowy cache wcale nie musi być szybszy od pobierania danych z bazy jako że operacje na dysku nie są wcale takie szybkie (szczególnie gdy inne procesy coś robią na dysku).
wookieb
Mówisz o szczególnych przypadkach. Poza tym jeżeli zapisujesz na dysku obiekt powstały w wyniku paru zapytań, taki cache jest zbawienny. Odczyt pliku z dysku jest na pewno szybszy od odczytu z bazy.
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.