Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sposob na mniej zapytan - cache?
Forum PHP.pl > Forum > Przedszkole
Bojakki
Tworze baze w ktorej bedzie docelowo opisanych okolo 30 tys rekordow. Na podstawie pewnego wspolczynnika zapisywanego w tabeli bedzie tworzony ranking. Chce jednak oszczedzic baze i sparwic by ranking byl generowany np 1 raz na 24h i potem gdzies przechowany skad by szly dane juz na strone, a nie by za kazdym razem gdy ktos wejdzie na strone przeszukiwano baze od poczatku. Slyszalem o czyms takim jak cache. Czy to jest najlepsze rozwiazanie w tym konkretnym przypadku? jak to dziala?

Ps. nie wiedzialem gdzie to pytanie bedzie lepiej pasowac tutaj czy w tablicy o MYSQL, ale mysle, ze tutaj lepiej wiec dalem:)
mike
cache, na jakiej zasadzie to dziala?
vtuner
najlepsze wg mnie jest cache. a jak dziala:

plik cache.php
  1. <?php
  2. function cache($url, $odstep=0) {
  3. $query = $_SERVER["QUERY_STRING"];
  4. $plik = "cache/".md5("$url?$query");
  5. if (!file_exists($plik) or time()-filemtime($plik)>$odstep) {
  6. $f = fopen($plik, "w");
  7. fwrite($f, file_get_contents("$url?$query&kopia=tak"));
  8. fclose($f);
  9. }
  10. readfile($plik);
  11. exit();
  12. }
  13. ?>


plik który ma być cacheowany
(dodajesz na samym początku)
  1. <?php
  2.  
  3. include 'cache.php';
  4. if (!isset($_GET["kopia"])) cache("http://www.adresstrony.pl/index.php",5*60);
  5. ?>


5*60 oznacza czas trwania w sekundach
5*60 = 300 sek = 5 min.
Jeśli chcesz żeby działało 24 h to musisz miec
25*3456 = 86400 sek = 1440 min = 24 h

Musizz również utworzyć katalog cache lub inny dowolny tylko musisz wtedy zmienić w cache.php
  1. <?php
  2. $plik = "cache/".md5("$url?$query");
  3. ?>

na
  1. <?php
  2. $plik = "twojkatalog/".md5("$url?$query");
  3.  
  4. ?>


i musisz nadac mu chmod 777
Bojakki
Cytat(mike_mech @ 2005-12-31 15:37:58)

No juz cos tam wiem;)

Nic jednak nie jest tak dobre jak jakis konkretny, ladny przykladzik.
Moze by ktos wygospodarowal 1-2 minutki swego czasu i napisal jak wyglada cache'owanie wyniku konkretnego zapytana:

  1. <?php
  2. $query = mysql_query("SELECT * FROM catalog order by points DESC LIMIT 10") or die("Blad");
  3. while($row=mysql_fetch_row($query)){
  4. echo $row[1];
  5. }
  6. ?>

To zapytanie da jakis tam tekst i teraz powiedzmy, ze chce by cache wyniku tego zapytania byl przechowywany w katalogu "cache" w pliku o nazwie "xxx" i zeby ten plik byl generowany od nowa o 24 w nocy codziennie bez wzgledu na to czy w bazie nastapily modyfikacje czy nie. No i oczywiscie by jak znajdzie plik cache w katalogu to zeby zapytanie nie bylo wykonywane.

Taki przyklad to byloby dla mnie wiecej niz 10000 slow tlumaczenia jak to dziala i juz bym mogl sobie to dpowiednio modyfikowac dla swoich potrzeb.
vtuner
a po co na konkretnym zapytaniu.

Po prostu cacheujesz cala stronę ktora wyswietla wynik. Ja mam tak u siebie i pieknie chodzi. Podałem przyklad wyzej
Bojakki
vtuner ---> dzieki Twoj przyklad jest dla mnie dosc zrozumialy.
mike
Cytat(Bojakki @ 2005-12-31 16:47:25)
Nic jednak nie jest tak dobre jak jakis konkretny, ladny przykladzik.

Jakbyś przeczytał ten wątek i wątki do których on odsyła to byś miał ładny kodzik tongue.gif

Podawałem tam link to pewnej klasy (akurat mojego współautowstwa) który może Ci przedstawić jak działa cache'owanie zapytań.
Klasę tą znajdziesz w dziale Algorytmu, klasy, funkcje.

Ale tak sobie myślę czy dasz radę ją znaleść, bo widzę że jesteś paskudny leń.
Od teraz mam Cię na oku tongue.gif
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.