Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> skeleton - wykorzystanie w praktyce
smiady
post
Post #1





Grupa: Zarejestrowani
Postów: 137
Pomógł: 2
Dołączył: 2.07.2007
Skąd: Ostrzeszów

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


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 ?
Go to the top of the page
+Quote Post
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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łę.

Ten post edytował Crozin 6.07.2014, 19:56:03
Go to the top of the page
+Quote Post
smiady
post
Post #3





Grupa: Zarejestrowani
Postów: 137
Pomógł: 2
Dołączył: 2.07.2007
Skąd: Ostrzeszów

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


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.
Go to the top of the page
+Quote Post
by_ikar
post
Post #4





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


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ń.

Ten post edytował by_ikar 7.07.2014, 14:24:45
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 03:01