Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Funkcja cache'ująca.
Novy.
post
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 8
Dołączył: 28.10.2011

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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.'


Ten post edytował Novy. 10.03.2012, 22:05:26
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
d3ut3r
post
Post #2





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----




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.


Go to the top of the page
+Quote Post
Novy.
post
Post #3





Grupa: Zarejestrowani
Postów: 50
Pomógł: 8
Dołączył: 28.10.2011

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/biggrin.gif)

jak byś mógł to poprawić bym był wdzieczny ;p
Go to the top of the page
+Quote Post
d3ut3r
post
Post #4





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


  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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Novy.
post
Post #5





Grupa: Zarejestrowani
Postów: 50
Pomógł: 8
Dołączył: 28.10.2011

Ostrzeżenie: (0%)
-----


Tyle, że nie wiem jak teraz to wyświetlić.

Chciałem pętlą while ale nie wiem jak (IMG:style_emoticons/default/haha.gif) pewnie tutaj też jest jakieś proste rozwiązanie (IMG:style_emoticons/default/biggrin.gif) Zrzuce wine na późną godzine (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
d3ut3r
post
Post #6





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Novy.
post
Post #7





Grupa: Zarejestrowani
Postów: 50
Pomógł: 8
Dołączył: 28.10.2011

Ostrzeżenie: (0%)
-----


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 ;<
Go to the top of the page
+Quote Post
d3ut3r
post
Post #8





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


  1. foreach ($mojWynik as $rekord)
  2. {
  3. echo 'Gracz: '.$rekord['login'];
  4. }
Go to the top of the page
+Quote Post
Novy.
post
Post #9





Grupa: Zarejestrowani
Postów: 50
Pomógł: 8
Dołączył: 28.10.2011

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
!*!
post
Post #10





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


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).

Ten post edytował !*! 11.03.2012, 12:19:53
Go to the top of the page
+Quote Post
Novy.
post
Post #11





Grupa: Zarejestrowani
Postów: 50
Pomógł: 8
Dołączył: 28.10.2011

Ostrzeżenie: (0%)
-----


A duża tablica to jaka? Może ja po prostu nie potrzebnie cache'uje (IMG:style_emoticons/default/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.

Ten post edytował Novy. 11.03.2012, 12:25:29
Go to the top of the page
+Quote Post
d3ut3r
post
Post #12





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 00:20