Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Funkcja cache'ująca.
Forum PHP.pl > Forum > Przedszkole
Novy.
Chciałem napisać własną funkcje cachującą, bo w necie są tylko systemy oparte na klasach. W związku z tym ze nie ogarniam OOP i nie lubie używać czegoś czego nie rozumiem nie chce ich używac biggrin.gif

Co źle robie? Wiem, że dziwnie napisane ;p samoukiem jestem więc dlatego błedy.

Czego nie jestem pewnien? Zapisywania wyniku do pliku i odczytania go. Nie wiem właściwie czy dobrze funkcje zbudowałem.. ;/

  1. function mysql_cache_query($zapytanie, $waznosc){
  2. $name = md5($zapytanie);
  3. $istnieje = file_exists('cache\\'.$name.'.cache');
  4. if(!$istnieje){
  5. $stworz = fopen("cache\\".$name.".cache", "w+");
  6. $tablica = mysql_fetch_array(mysql_query("$zapytanie"));
  7. $serialize = serialize($tablica);
  8. $fp = fopen('cache\\'.$name.'.cache', "a");
  9. flock($fp, 2);
  10. fwrite($fp, $serialize);
  11. flock($fp, 3);
  12. fclose($fp);
  13. return $tablica;
  14. }
  15. else{
  16. $mtime = filemtime('cache\\'.$name.'.cache');
  17. $rtime = time() - ($waznosc*60);
  18. if ($mtime < $rtime){
  19. unlink('cache\\'.$name.'.cache');
  20. $tablica = mysql_fetch_array(mysql_query($zapytanie));
  21. return $tablica;
  22. }
  23. else{
  24. $tablica = unserialize(fread(fopen('cache\\'.$name.'.cache', "a"), filesize('cache\\'.$name.'.cache')));
  25. return $tablica;
  26. }
  27. }
  28. }


tak wywołuje funkcje

  1. mysql_cache_query('SELECT * FROM users ORDER BY posts DESC', 1);


no i później chce wyświetlić info z tablicy:

  1. echo 'Użytkownik '.$tablica['login'].': '.$tablica['posts'].' postów.'
d3ut3r


to pobiera tylko 1 rekord z wyniku zapytania. Musisz dodać pętlę która przeskoczy po wszystkich rekordach.

  1. fopen('cache\\'.$name.'.cache', "a")


tutaj otwierasz plik do zapisu, a chcesz z niego odczytywać

  1. unlink('cache\\'.$name.'.cache');
  2. $tablica = mysql_fetch_array(mysql_query($zapytanie));
  3. return $tablica;


tutaj usuniesz cache ale nie zapiszesz go w tym samym momencie nie lepiej byłoby odświeżać cache w tym samym czasie ? skoro jest już usunięty to możesz z wnętrza funkcji wywołać samą siebie i zapisać od razu nowy cache.


Novy.
Błąd #2 - poprawione.

Błąd #3 - poprawione.

Z 1 musisz mi pomóć bo nie wiem o co chodzi ;d

tzn wiem ze mysql_fetch_array zwraca 1 rekord, ale w jaka petle mam wrzucic ? while? troche nie ogarniam biggrin.gif

jak byś mógł to poprawić bym był wdzieczny ;p
d3ut3r
  1. $tablica = mysql_fetch_array(mysql_query("$zapytanie"));

na:
  1. $res=mysql_query($zapytanie);
  2. while($rekord=mysql_fetch_array($res))
  3. {
  4. $tablica[]=$rekord;
  5. }


chyba tak smile.gif
Novy.
Tyle, że nie wiem jak teraz to wyświetlić.

Chciałem pętlą while ale nie wiem jak haha.gif pewnie tutaj też jest jakieś proste rozwiązanie biggrin.gif Zrzuce wine na późną godzine biggrin.gif
d3ut3r
robisz np:
  1. $mojWynik=mysql_cache_query("SELECT * FROM users",1);
  2. print_r($mojWynik);


i sprawdź czy wyświetli Ci tablicę zawierającą to co powinno wyjść z bazy
Novy.
Zwraca co potrzeba.

Tylko jak to wyświetlić w takiej liscie?

Bez tego używałem while np.:

  1. $i = 0;
  2. while($tablica = mysq_fetch_array($q)){
  3. echo $i.'. Gracz: '.$tablica['login'];
  4. $i++;
  5. }


a teraz nie wiem jak, jak wstawie $mojWynik=mysql_cache_query("SELECT * FROM users",1); albo $mojWynik do while to mi się robi nieskonczona lista ;<
d3ut3r
  1. foreach ($mojWynik as $rekord)
  2. {
  3. echo 'Gracz: '.$rekord['login'];
  4. }
Novy.
Mam mieszane uczucia co do tego cache'owania.

Fakt ze zapisuje się do pliku i nie trzeba pytać bazy, ale czy to jest szybsze? Wykonanie funkcji + foreach?
!*!
Sama funkcja jest moim zdaniem za bardzo przekombinowana, szczególnie fopen itp. A czy jest to szybsze? Zależy jak duża jest baza, poza tym foreach też możesz wrzucić jako cache (w zasadzie to nawet powinieneś, o ile jest to naprawdę b. duża tablica).
Novy.
A duża tablica to jaka? Może ja po prostu nie potrzebnie cache'uje biggrin.gif

Może inaczej: Jaką tablice powinno się cache'ować?

A można zastąpić fopen czymś innym? Jeśli tak to czy mógłbyś mi to pokazać na jakimś przykładzie?

Jeśli coś jest zbędne lub gorsze od czegoś to chętnie to usune/zmienie z funkcji.
d3ut3r
możesz użyć np: http://www.php.net/manual/pl/function.file-get-contents.php i http://www.php.net/manual/pl/function.file-put-contents.php

generalnie to z cache jest tak że powstała masa klas do tego i warto rozejrzeć się za czymś gotowym poświęcisz czas na zrozumienie tego i zdobędziesz nowe doświadczenie smile.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.