Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: DBAL i cache
Forum PHP.pl > Forum > PHP
q.michal
Czesc,

Przymierzam sie wlasnie do pisania klasy obslugujacec baze danych z wykorzystaniem PDO.
Zastanawiam sie jednak, czy jest sens wykorzystywac bezposrednio w tej klasie cache?
Konkretnie na mysli mam utworzenie objektu klasy Cache w $this->cache klasy bazy danych.
Nastepnie przy selectach sprawdzenie czy tych danych nie ma juz w cache i czy ten nie wygasl.
Dzieki temu, mozna by nieco odciazyc baze, a same dane pobrane z bazy zapisywac jako chociazby MD5 z zapytania.

Inna sprawa, ze wowczas musialbym ten cache jakos uaktualniac po insertach i updateach, ale nie bede mial hashy selectow, wiec docelowo pewnie chcialbym czyscic caly cache po kazdym zapisie do bazy.

Co sadzicie o takim rozwiazaniu?
Pyton_000
Beznadziejne.

Jak sam widzisz masz wiele ograniczeń.

Najwygodniej jest używać oddzielnej klasy cache, i tam wrzucać pobierać itd.
Od biedy możesz zrobić z Cache dekorator na BD.
q.michal
To ma byc oddzielna klasa. Zastanawiam sie tylko czy jest sens wykorzystywac ja w klasie implementujacej obsluge DB.
AFAIK phpBB3 tak robi, a w katalogu cache sa pliki sql_[hash] w ktorych przechowuje to co juz wyciagnal z bazy.
Pyton_000
Tak, oddzielna, ale to nie w klasie BD masz się zajmować wrzucaniem danych do cache, a odwrotnie np:

  1. $data = Cache::get('jakis_klucz', 10, function() {
  2. return $zapytaniePobieajaceDane;
  3. });

Dzięki temu jeśli jest klucz to pobiera z cache, jak nie ma albo się przeterminował to pobiera świeże dane, wrzuca do cache i zwraca.
lukaskolista
Pyton - Twoje rozwiązanie narzuca na programistę obowiązek ręcznego sterowania cachem i wpychania go praktycznie wszędzie tam, gdzie jest zapytanie do bazy - DRY.

Cytat
Od biedy możesz zrobić z Cache dekorator na BD.
Według mnie świetne rozwiązanie zwłaszcza w przypadku, gdy korzystasz z kontenera usług.

Masz jeszcze możliwość wykorzystania programowania aspektowego, ale to już totalna abstrakcja w php.
Pyton_000
Czy znowu takie straszne? Nie widzę nic złego w tym że mam możliwość zastosowania cache tam gdzie chcę i jak chcę.
Nadając tagi i nazwy dla cache mam możliwość dowolnego zmieniania stanu cache np. wyczyszczenie wg. tagów, nazw itd.

Użycie dekoratora jest o tyle niewygodne że masz mniejszą kontrolę nad tym w jaki sposób przechowujesz.

Chyba że masz na myśli jakieś rozwiązanie na które aktualnie nie wpadłem wink.gif
q.michal
Z 2 strony patrzac, czy obsluga cache bezposrednio w klasie DBAL jest czyms zlym?
Takie rozwiazanie pozwoliloby buforowac wszystkie selecty zmniejszajac liczbe zapytan na bazie do minimum.
Podczas kazdej aktualizacji, co przeciez wykonuje sie rzadziej mozna wyczyscic caly cache z tagiem 'sql'.
Malo tego, mozna w metodach aktualizujacych, dac sobie mozliwosc wykonania aktualizacji na bazie bez czyszczenia cache, co przyda sie np. przy wbijaniu sesji.
Wtedy w ogole nie trzeba bedzie o nic dbac. Jak juz wspomnialem rozwiazanie takie znalezc mozna z tego co wiem w phpBB czy CI.
lukaskolista
Dekorator jest ok zwłaszcza wtedy, gdy zapytanie traktujesz jako obiekt, np.
  1. class FindAllActiveUsers
  2. {
  3. public function __invoke($limit)
  4. {
  5. return array('abc');
  6. }
  7. }
  8.  
  9. class CachableResult
  10. {
  11. public function __invoke()
  12. {
  13. // Czy wynik w cache...
  14.  
  15. // Jak nie, to zapytanie
  16. $result = call_user_func_array($this->query, func_get_args());
  17.  
  18. // Tutaj zapis do cache...
  19.  
  20. return $result;
  21. }
  22. }
  23.  
  24. $findAllActiveUsers = new CachableResult(new FindAllActiveUsers());
  25. $activeUsers = $findAllActiveUsers(5);

Powyższy przykład jest bardzo prosty i niekompletny, ale daje pogląd na rozwiązanie.
viking
Możesz jakieś eventy też popodpinać w stylu onbeforeselect wczytaj z cache.
Chociaż we wszystkich frameworkach stosuje się rozwiązanie które podał @Pyton_000
lukaskolista
Masz rację viking, takie rozwiązanie stosuje się, ponieważ twórcy frameworka nie wiedzą, w jaki sposób to wykorzystasz. Nic nie stoi na przeszkodzie, żeby dodać swoją warstwę abstrakcji. Takie hardkodowane rozwiązanie może przysporzyć problemów w przypadku, gdy korzystamy z cache i nagle chcemy się go całkowicie pozbyć.
Pyton_000
W dekoratorach masz to samo...
lukaskolista
Tylko jest różnica, jak 100 razy musisz rzeźbić ify, a 100 razy użyć dekoratora. Moje rozwiązanie opiera się na zasadzie DRY, a ręczna rzeźba ifów już niebardzo.
Pyton_000
A gdzie w moim rozwiazaniu masz ify?
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.