Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: skeleton - wykorzystanie w praktyce
Forum PHP.pl > Forum > PHP > Object-oriented programming
smiady
Oto pewne wykorzystanie Skeletona:

  1. class PDO2 extends PDO {
  2. private static $obiekt= null;
  3.  
  4. public function __construct() {
  5. parent::__construct('mysql:host=localhost;dbname=test', 'root', '');
  6. }
  7.  
  8. public static function skeleton() {
  9. if(self::$obiekt instanceof PDO2)
  10. return self::$obiekt;
  11. else {
  12. self::$obiekt= new PDO2();
  13. return self::$obiekt;
  14. }
  15. }
  16. }


Jego działanie polega na tym, że gdy pierwszy raz korzystamy ze statycznej metody PDO2::skeleton() utworzy się połączenie z bazą danych, za każdym kolejnym wykonaniem zwróci obiekt, który już powstał. Zastanawiam się nad wykorzystaniem tego przypadku czy warto.
Co jest lepsze.
Pierwszy przypadek: tworze skeletona przy logowaniu użytkownika (czyli tworze połączenie z bazą danych) i trzymam w sesji, gdzie za każdym razem, gdy przechodzę do innego pliku odczytuje z sesji skeletona i metodą pobieram połączoną już bazę danych.
Drugi przypadek: Za każdym razem, gdy przechodzę do innego pliku .php w systemie tworzę nowe połączenie z bazą danych i zamykam je.
Co jest lepsze ?
Crozin
1. Nie spotkałem się jeszcze z nazwą "skeleton", to co podałeś to "singleton".
2. Jest bardzo mało przypadków, gdzie jego wykorzystanie ma jakikolwiek sens, mimo to w sieci znajdziesz pełno przykładów jego użycia, niestety najczęściej robią one więcej złego niż dobrego.
3. Dane wrzucone do sesji są poddawane procesowi serializacji przed zapisem i deserializacji przed odczytem (Google: https://www.google.pl/search?q=php+serializ...93&ie=UTF-8 ) więc na dobrą sprawę i tak będziesz miał tworzony nowy obiekt na każdej podstronie. Dodatkowo dane typu resource (PDO trzyma takie coś w swoim wnętrzu) nie mogą być serializowane.
4. Utrzymywanie jakiejś puli obiektów PDO wykorzystywanych przez kolejne żądania (connection pool) byłoby bardzo dobre, niestety w PHP na dobrą sprawę nie da się tego osiągnąć - istnieje coś takiego jak persistent connections ale nie sprawuje się to za dobrze.

Jeżeli nie widzisz miejsca na użycie Singletonu, nie próbuj go nigdzie wrzucić na siłę.
smiady
Wniosek z tego jest taki, że singletony trzymane w sesji tracą sens, bo za każdym wywołaniem i tak tworzy się wewnątrz obiektu nowy obiekt. Szkoda, że tak jest.
by_ikar
Cytat(Crozin @ 6.07.2014, 20:54:54 ) *
4. Utrzymywanie jakiejś puli obiektów PDO wykorzystywanych przez kolejne żądania (connection pool) byłoby bardzo dobre, niestety w PHP na dobrą sprawę nie da się tego osiągnąć - istnieje coś takiego jak persistent connections ale nie sprawuje się to za dobrze.


Różnicy nie odczujesz w presistant connections jeżeli łączysz się do bazy lokalnie, dlatego może ci się wydawać że nie sprawuje się to za dobrze (chyba że chodziło ci o coś innego). Najbardziej to widać w przypadku zdalnych połączeń (do innej maszyny). Co prawda wciąż to nie jest nie wiadomo jak duży skok "wydajnościowy", ale w niektórych przypadkach daje to ciekawe rezultaty.

Aha no i na współdzielonych serwerach, też ciężko to ujrzeć, bo np taki mysql ma domyślnie ustawionych 151 otwartych połączeń. Więc jeżeli jest więcej webserwerów które łączą się z mysql na domyślnych ustawieniach, to tego też się nie uświadczy. Potrzebny jest większy limit otwartych połączeń.
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-2024 Invision Power Services, Inc.