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
Ten post edytował athabus 15.06.2006, 19:28:22 |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%)
|
@Cysiaczek
Czy chodzi Ci o cos takiego?
Czyli ze klasa DB includuje klasy db result itd? Robilem to dlatego, ze np. klasa Db "zwraca" wynik jako obiekt db_result. Czy includowanie powinno byc w osobnym pliku (dajmy na to w pliku korzystajacym z Db)? Myslalem ze tak jak jest teraz jest ok bo nie trzeba pamietac o includowaniu pozostalych klas. @mariuszn3 - nawet nie wiedziale ze mySql cachuje wyniki (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Ale mi bardziej chodzi o to, ze np. masz elementy ktore sie rzadko zminiaja (np. opis produktu w sklepie internetowym) - moja klasa przechowuje informacje w cachu domyslnie przez 24 godziny. Jesli ktos w tym czasie bedzie probowal odczytac ten wynik zrobi to znacznie szybciej niz laczac sie z baza. Nawet jesli wynik jest cachowany przez baze to i tak trzeba go pobrac. Musze zrobic dokladne testy na jakiejs bazie sensownej wielkosci ale powinno to dzialac szybciej niz standardowo. @dr_bonzo - myslalem ze to byl jeden ciag myslowy (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Co do blokow try-catch wydaje mi sie ze tak jak sa teraz (po drobnej korekcie z die() ) w przykladzie jest ok (ale tak jak mowilem dopiero zaczynam php wiec moge sie mylic), jedyne co warto by tam poprawic to to, zeby lapac wyjatek PgException zamista standardowego - tyle ze tutaj nie bylo sensu bo i tak nie podajmowale zadnej decyzji w zaleznosci od rodzaju wyjatku. W prawdziwej aplikacji nalezalo by to zmienic. A i jeszcze jedno - zapomniale o to spytac w pierwszy poscie. Wynik cachowanych zapytan przechowuje w pliku o nazwie 'typ zapytania (assoc/numeric)' . sha1 z zapytania . 'txt' czyli np: as_asdlkjqasdf02dd2lj3jv09qnajkfa.txt myslicie ze tak jest poprawnie? Bo w innych przykladach widzialem nazwy plikow nadawane recznie lub zapytanie jako nazwa pliku. Ale w 1 przypadku wydaje mi sie ze jest to niewygodne w uzytkowaniu a w 2 nazwy przy skomplikowanych zapytaniach byly zbyt dlugie. Jestem swiadom ze moje rozwiazanie tez nie jest doskonale ale co o nim myslicie? |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 352 Pomógł: 0 Dołączył: 22.01.2006 Ostrzeżenie: (0%)
|
@mariuszn3 - nawet nie wiedziale ze mySql cachuje wyniki (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Ale mi bardziej chodzi o to, ze np. masz elementy ktore sie rzadko zminiaja (np. opis produktu w sklepie internetowym) - moja klasa przechowuje informacje w cachu domyslnie przez 24 godziny. Jesli ktos w tym czasie bedzie probowal odczytac ten wynik zrobi to znacznie szybciej niz laczac sie z baza. Nawet jesli wynik jest cachowany przez baze to i tak trzeba go pobrac. Musze zrobic dokladne testy na jakiejs bazie sensownej wielkosci ale powinno to dzialac szybciej niz standardowo. Myślę, że to może mieć sens tylko wtedy jeśli faktycznie w ogóle przy przejściu całego skryptu unikasz połączenia z bazą.. a nie kiedy unikasz wywołania zapytania przy i tak już nawiązanym połączeniu z bazą. Zwróć uwagę, że rozszerzenia php do łączenia z bazą (mam na myśli mysql czy mysqli, ten ostatni nawet jest napisany poprzez programistów mysql) są napisane z poziomu języka C. Czyli z zasady są one dużo szybsze niż jakiekolwiek próby uzupełniania czy zastępowania ich przez kod php - w momencie jak już masz połączenie z bazą, wszystkie zapytania odbywają się bardzo szybko. Według moich testów szybkość zwrócenia scache'owanej odpowiedzi na zapytanie wacha się w granicach kilku mikrosekund((IMG:http://forum.php.pl/style_emoticons/default/exclamation.gif) ). Przykładowo u mnie na Win XP PIV: pierwsze zapytanie 0.5sek.. Późniejsze wywoływanie tego samego zapytania - 0.005 sek. Mam duże wątpliwości czy oddawanie tej funkcjonalności klasie php jest w stanie to przyspieszyć, obawiam się nawet, że już sam fakt kodowania w php klasy cache'ującej sprawi, że wynik będzie gorszy. Natomiast przykład, który przytoczyłeś, czyli przykładowo rzadko zmieniający się opis produktu, cache'ował bym nie poprzez klasy do cache'owania zapytań do bazy ale przez coś bardziej uniwersalnego. przykładowo poprzez coś takiego jak turck mmcache, którym właśnie możesz cache'ować wyniki często powtarzających się przejść tego samego algorytmu... i też to będzie mega szybsze niż jakaś klasa w php do cache'owania, bo mmcache jest to rozszerzenie napisane w C. Ten post edytował mariuszn3 16.06.2006, 17:30:55 |
|
|
|
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
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 ![]() ![]() |
|
Aktualny czas: 24.12.2025 - 00:18 |