Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][PDO] Połączenie dopiero kiedy potrzebne
Forum PHP.pl > Forum > Przedszkole
favik
Witam,
poszukuje dodatku do PDO umożliwiającego łączenie się z bazą danych dopiero gdy jest ono naprawdę potrzebne i jakieś dane się faktycznie pobierze (podobno ma coś takiego Doctrine).
Ogólnie chcę zastosować cache wygenerowanego html'a (i tu wykorzystuje cache w Smarty) i cache zapytań do bazy danych (np na podstawie cache Nospora, który wykorzystać chce np w zapytań ajax'owych, do których nie będę już zaprzęgał Smarty), a co za tym idzie wielokrotnie nawet takie samo połączenie z bazą będzie niepotrzebne.

Dodatkowo taki dodatek mógłby liczyć ilość wykonanych zapytań do bazy czy czas ich wykonywania.

W obiektówce jestem początkujący. Gdy taką nakładkę zrobię przez dziedziczenie połączenie będzie nawiązywane automatycznie i tak kiedy utworzę klasę pochodną?
Aby moja klasa przypuśćmy myPDO, aby działała tak jak chce musiała by zawierać wszystkie metody takie jak PDO i w momencie wykorzystania którejś z nich od razu najpierw sprawdzała by czy połączenie już istnieje i jeśli nie najpierw je tworzyła.
Pytanie czy mój tok myślenia jest dobry? Może coś takiego już istnieje tylko nie znalazłem? Doctrine nie wiem czy jest sens tutaj wykożystywać, a co najważniejsze uczyć go się dla tego celu? Może jakiś inny sposób?

Pozdrawiam !
Crozin
Doctrine DBAL (nie mylić z ORM-em)?
favik
Z tego co przejrzałem, Doctrine DBAL chyba nie wprowadza dużych zmian co do kożystania z samego PDO, reszta metod wygląda identycznie poza kilkoma nowymi?

1. Rozumiem, że obiekt PDO też będzie tworzony dopiero gdy będzie potrzebne pobranie danych z bazy, a więc jak bym tego nie robił w takim przypadku nie wystąpią błędy przy przekazaniu obiektu pdo?

  1. class User {
  2. protected $pdo;
  3.  
  4. public function __construct(PDO $pdo) {
  5. $this->pdo = $pdo;
  6. }
  7.  
  8. ...
  9.  
  10. }


2. Jak z używaniem cache? Nie mogę sie doszukać. Chyba już w tym przypadku potrzebował bym całego ORM?
3. Może jakieś inne pomysły jak OPD?
Crozin
1. Jeżeli przekazujesz "czysty" obiekt PDO to nie masz żadnej dodatkowej kontroli nad jego działaniem. Musiałbyś przekazywać obiekt Doctrine\DBAL\Connection.
2. Doctrine'owski DBAL to jedynie warstwa abstrakcji nad połączeniem z bazą danych realizowanym przez PDO - tak więc cache dla wyników zapytań nie leży w gestii tego narzędzia.
by_ikar
Tworzysz instancje PDO dopiero wtedy kiedy wykonujesz jakieś zapytanie, poprzez swoją nakładkę, dopiero kiedy takie zapytanie zostanie przekazane, tj twój obiekt zostanie gdzieś wykorzystany, dopiero zanim przekazane zostanie zapytanie do PDO, dopiero wtedy sprawdzasz czy istnieje instancja PDO. A taki przykładowy kod mógłby wyglądać tak:

  1. <?php
  2.  
  3.  
  4. class Database
  5. {
  6. protected $connection = null;
  7. protected $dsn;
  8. protected $username;
  9. protected $password;
  10. protected $driver_options;
  11.  
  12. public function __construct($dsn, $username = null, $password = null, array $driver_options = array())
  13. {
  14. $this->dsn = $dsn;
  15. $this->username = $username;
  16. $this->password = $password;
  17. $this->driver_options = $driver_options;
  18. }
  19.  
  20. public function connect()
  21. {
  22. $this->connection = new PDO($this->dsn, $$this->username, $this->password, $this->driver_options);
  23. }
  24.  
  25. public function query($sql)
  26. {
  27. if(null === $this->connection)
  28. {
  29. $this->connect();
  30. }
  31.  
  32. return $this->connection->query($sql);
  33. }
  34. }


IMO nie wiem po co ci tworzyć połączenie dopiero jak jest potrzebne. Połączenie z bazą danych nie wiele cię kosztuje, jeżeli chodzi o zasoby, także nie wiem skąd takie pomysły wink.gif
Crozin
@by_ikar: Bo połączenie z bazą danych jest kosztowne. Powinno się jeszcze nadpisać: beginTransaction(), exec(), getAttribute(), getAvailableDrivers(), inTransaction(), prepare(), quote(), setAttribute(), a w przypadku innych wyrzucić wyjątek.
by_ikar
Tak tak, wiem, to jest przykład, o czym wspomniałem. Kosztowne może i jest, ale czy aż tak bardzo? W specyficznych miejscach może to być przydatne, na średnich lotów stronie, nie wydaje mi się aby to było jakoś specjalnie przydatne.. Aczkolwiek fakt, jest to jakaś opcja w miejscach gdzie nie operujemy danymi z bazy i ta baza jest nam zbędna. Hmm, w swojej "nakładce" na PDO, akurat dziedziczę PDO, żeby właśnie nie przepisywać tych wszystkich metod, ale sam się nad takim wyjściem zastanowię..
favik
@by_ikar: Dokładnie o coś takiego mi chodziło, mówiąc o rozszerzeniu PDO. Zachowa swoją budowę, a jedynym "problemem" będzie nadpisanie każdej metody w PDO metodą o takiej samej nazwie w mojej klasie.

Jednak dużo czytałem i w wielu miejscach polecają Doctrine. Jednak mam takie pytanie. Skrypt chciał bym zoptymalizować pod serwer wirtualny i czy cache z doctrine będzie dostępne na takim serwerze? W grę wchodzi tutaj chyba jedynie standardowe cache na plikach? Czy na doctrine to osiągnę (w dokumentacji mowa jest o: APC, XCache, memcache)?
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.