Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [zestaw klas PHP5]Cachowanie zapytan db, prosze o ocene/sugestie
athabus
post
Post #1





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Witam, ostatnio postanowilem sie zajac cachowaniem zapytan z bd. I tak pomalutku stworzylem swoja klase do cachowania/odczytywania zapytan z PostgreSQL. Klasa po malych przerobkach bedzie dzialac rowniez z MySQL.

Na poczatek, co by nie byc posadzony o plagiat (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) od razu przyznam sie ze korzystalem z rozwiazania mike_mecha (http://php.nq.pl/index.php?showtopic=22487&hl=cache) - ale oczywiscie tyko pogladowo (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Na poczatek moze diagram mojego rozwiazania
Diagram klas
(uml znam slabo wiec pewnie sa bledy w diagramie jesli chodzi o oznaczenie relacji)

Co do kodu to znajduje sie on tutaj: (podaje linki bo kodu jest za duzo na wklejanie)
Klasa DB -glowna klasa bazy danych
Db_result - abstrakcyjna klasa wyniku zapytania
Db_Result_orig - wynik zapytania wykonanego z bazy
Db_result_cache - wynik zapytania wykonanego z cachu (lub z bazy z pozniejszym cachowaniem)
GenericException - Rozszerzenie klasy Exception o zapis wyjatkow do loga
PGException - klasa wyjatku bazy danych

Klasy dodatkowo korzystaja z kilku stalych (np. connection string, sciezka do katalogu z cachem itp), ktore
trzymam w osobnym pliku -> gdyby ktos chcial przetestowac na zywo dzialanie klasy to trzeba odpowiednie pliki wygenerowac wraz ze stalymi.

Najwazniejsze cechy moich klas to:
- cachowanie zapytan do pliku tekstowego / odczytywanie zapytan z takiego cachu
- system obslugi wyjatkow z zapisem bledow do logow
- mozliwosc iterowania wyniku - zastsowany interfejs iteratora

Jako ze jestem poczatkujacy prosze o ocene kazdego aspektu, ktory przyjdzie wam do glowy - poczynajac od kodu a na organizacji projektu konczac - kazda rada / wytkniecie bledu mile widziane.

Przykladowe zastosowanie
  1. <?php
  2.  include_once ('db/db.class.php');
  3.  include_once ('const_db.php'); 
  4.  
  5.  $sql='select * from produkty';
  6.  
  7.  try
  8.  {
  9.  $db=Db::getInstance();
  10.  }
  11.  catch (Exception $e)
  12.  {
  13.  echo $e; 
  14. [indent] die()
  15.  }
  16.  
  17.  try
  18.  {
  19. //odczyt zapytania z cachu. Jesli brak cachu dla zapytania to odczyt z bazy
  20. //nastepnie cachowanie jest zapisywane
  21. // 2 parametr mowi ze wynik ma byc jako tablica asocjacyjna, 3 parametr
  22. //mowi ze cache bedzie wazny przez godzine (3600 sekund) - oba parametry sa opcjonalne
  23.  foreach ($db->query_cache($sql, true, 3600) as $row)
  24.  {
  25.  echo $row['nazwa_produktu'] . '<br/>';
  26.  }
  27.  }
  28.  catch (Exception $e)
  29.  {
  30.  //wyswietla pelen opis bledu wraz z zapytaniem i opisem bledu
  31.  //uzywac tylko przy testowaniu - w kodzie produkcyjnym raczej
  32.  //nie powinno sie znalezc gdyz haksior moze poznac strukture bazy
  33.  $e->toScreen();
  34.  }
  35.  
  36.  try
  37.  {
  38.  //przyklad uzycia zapytania bez cachowania (drugi parametr oznacza odczyt numeryczny)
  39.  foreach ($db->query_db($sql,false) as $row)
  40.  {
  41.  echo $row[0] . '<br/>';
  42.  }
  43.  }
  44.  catch (Exception $e)
  45.  {
  46.  echo $e;
  47.  }
  48.  
  49.  //oczywiscie mozna rowniez odczytywac pojedyncze wyniki
  50.  $result=$db->query_cache($sql);
  51.  //odczyt 4 wiersza
  52.  $row=$result->fetch_row(3);
  53.  
  54.  
  55. ?>


Ten post edytował athabus 15.06.2006, 19:28:22
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
athabus
post
Post #2





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


mariuszn3Dzieki za przeprowadzenie testow. Mysle ze wyniki z uzyciem mojej klasy bylyby podobne - uzylem podobneg rozwiazania jak mike_mech tyle ze dodalem kilka funkcjonalnosci.
Chetnie porownalbym wyniki na moim kompie uzywajac MySQL'a ale niestety nie mam go zainstalowanego (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) (ostatnio korzystam z PG i jakos nie zainstalowalem).
Nie wiem czy PG ma cachowanie wynikow - recznie go w kazdym razie nie instalowalem - uzywam wersji "prosto z pudelka".

Teraz tylko zastanawia mnie w jaki sposob mySQL cachuje wyniki. W pamięci operacyjnej? Jesli tak to musza one byc nietrwale. Na pewno daja spore rezultaty przy czesto wykonywanych zapytaniach, ale przy rzadziej sie powtarzajacych (dajmy na to raz na godzine) ten mechanizm sie nie sprawdzi tak dobrze. (wszystko co tu pisze to moje przemyslenia nie poparte testami). Kwestia teraz proporcji zapytan czesto sie powtarzajacych do tych rzadziej sie powtarzajacych -> duzo niewiadomych (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Wszystko to sklania mnie do napisania dodatkowej klasy do testowania czasow zapytan + dostosowanie jej do mySQL. Fajnie byloby sprawdzic jaki procent zapytan stanowia zapytania cyklicznie sie powtarzajace.

Mysle ze w warunkach "produkcyjnych" moja klasa da pozytywne rezultaty - w ostatecznosci ograniczy obciazenie bazy - ale Twoje testy daja mi duzo do myslenia.

Co do ustalenia polacznenia dopiero przed wywolaniem zapytania korzystajacego z bazy - to swiadomie porzucilem ten pomysl. Sytuacja wygenerowania strony bez zadnego zapytania do bazy (pisze ten sterownik pod katem sklepu internetowego, ktory chce sobie napisac) jest raczej malo prawdopodobna wiec polacznie i tak bedzie trzeba ustanowic.
Go to the top of the page
+Quote Post
mariuszn3
post
Post #3





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


Cytat(athabus @ 16.06.2006, 21:56 ) *
Teraz tylko zastanawia mnie w jaki sposob mySQL cachuje wyniki. W pamięci operacyjnej? Jesli tak to musza one byc nietrwale. Na pewno daja spore rezultaty przy czesto wykonywanych zapytaniach, ale przy rzadziej sie powtarzajacych (dajmy na to raz na godzine) ten mechanizm sie nie sprawdzi tak dobrze. (wszystko co tu pisze to moje przemyslenia nie poparte testami). Kwestia teraz proporcji zapytan czesto sie powtarzajacych do tych rzadziej sie powtarzajacych -> duzo niewiadomych (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Na pewno MySQL cache'uje wyniki w pamięci operacyjnej, dzięki temu ma bardzo szybki dostęp dodanych, czemu uważasz, że muszą być one nie trwałe? Zwróć uwagę, że serwer na którym stoi strona restartuje się może kilka razy w roku a dane w pamięci operacyjnej nie są jak atrament sympatyczny, który po godzinie sam znika.
Według mnie pamięć operacyjna to zdecydowanie najlepsze rozwiązanie. Co do tego jak działa od środka, no to nie studiowałem tego.. ale podejrzewam, że ogólna zasada jest prosta. W ustawieniach serwera ustawiasz wielkość cache'u.. w manualu pisze, że domyślnie jest to wartość 0 (!) co na starcie wykluczałoby cache'owanie ale mam wrażenie, że w domyślnym pliku konfiguracyjnym, który wgrywa się wraz z instalacją serwera jest wpisana dodatnia wartość, ja bardzo w swojej konfiguracji nie grzebalem i mam wpisane 8MB. Serwer zapełnia ten cache póki może a jak się okazuje, że zbliża się do limitu wtedy nadpisuje te najstarsze zapytania, to tylko moje przypuszczenie. Wierzę, że jest to bardzo logicznie rozwiązane w końcu nie takie głowy nad tym siedziały.
Z dodatkowych rzeczy, jest ustawienie, które ustala powyżej jakiej wielkości nie cache'ować odpowiedzi (domyślnie 1MB), jak i też możesz ustawić cache'owanie na zawołanie.. ale wtedy każde zapytanie, które życzysz sobie aby MySQL cache'ował musisz zacząć poprzez 'SELECT SQL_CACHE' też można w drugą stronę, ustawić aby cache'ował wszystkie (tak jest domyślnie) a jeśli chcesz uniknąć cache'owania w jakimś zapytaniu zaczynasz zapytanie poprzez 'SELECT SQL_NO_CACHE'.
W manualu też mocno zwracają uwagę, że w przypadku mnogości różnych małych nie powtarzających się zapytań tak naprawdę cache'owanie może bardziej popsuć wydajność niż ją poprawić.. ale to jest logiczne i dotyczy jakiegokolwiek systemu cache'owania... aby cache'owanie się zwróciło zapytania muszą się powtarzać, to się rozumie samo przez sie.

Ten post edytował mariuszn3 16.06.2006, 23:36:43
Go to the top of the page
+Quote Post

Posty w temacie
- athabus   [zestaw klas PHP5]Cachowanie zapytan db   15.06.2006, 18:55:09
- - dr_bonzo   Przyklad uzycia jest lipny -- co bedzie jak nie po...   15.06.2006, 19:17:13
- - athabus   Dodałem die() w razie bledu polaczenia. Faktycznie...   15.06.2006, 19:33:23
- - dr_bonzo   CytatDodałem die() w razie bledu polaczenia Tez zl...   15.06.2006, 20:25:19
|- - athabus   Cytat(dr_bonzo @ 15.06.2006, 19:25 ) Tez ...   15.06.2006, 20:45:58
- - mariuszn3   Nie wiem jak jest z Postgre ale przecież w MySQL c...   16.06.2006, 12:41:57
- - ActivePlayer   CytatPo co więc pisać w php klasę, która by przejm...   16.06.2006, 12:46:03
- - Cysiaczek   Nie chcę przesadzić, ale muszę z wnioskiem formaln...   16.06.2006, 12:51:30
- - dr_bonzo   CytatTu sie gdzies zgubilem - o jakich blokach mow...   16.06.2006, 14:00:17
- - athabus   @Cysiaczek Czy chodzi Ci o cos takiego? [PHP] pobi...   16.06.2006, 14:52:34
|- - mariuszn3   Cytat(athabus @ 16.06.2006, 13:52 ) @mari...   16.06.2006, 17:28:15
- - ActivePlayer   CytatPrzykładowo u mnie na Win XP PIV: pierwsze za...   16.06.2006, 18:21:23
- - athabus   Zrobile maly test. Wykonalem 1000 zapytan uzywaja...   16.06.2006, 18:22:18
- - ActivePlayer   jesli chodzi o nawiązywanie połączenia... przeciez...   16.06.2006, 18:48:15
- - athabus   To prawda, ale wyszedlem z zalozenia, ze jeszcze n...   16.06.2006, 19:20:01
- - mariuszn3   Zrobiłem parę testów na MySQL. Niestety ...   16.06.2006, 22:06:13
- - athabus   mariuszn3Dzieki za przeprowadzenie testow. Mysle z...   16.06.2006, 22:56:00
|- - mariuszn3   Cytat(athabus @ 16.06.2006, 21:56 ) Teraz...   16.06.2006, 23:31:09
- - eai   Nie szyfrujesz danych zapisanych w cache. Powinien...   11.08.2006, 13:50:24
|- - NuLL   Cytat(eai @ 11.08.2006, 14:50:24 ) Ni...   6.10.2006, 00:37:47
- - pawel_   z tego co widze, to zapomniałeś o jednej małej rze...   14.08.2006, 15:45:10
- - alpin19   btw... UML jest baaardzo marny. Polecam szczegółow...   6.10.2006, 00:31:16


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: 2.10.2025 - 21:17