Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][REDIS] Wykorzystywanie klienta Redis w projekcie
tadeurz
post
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 1
Dołączył: 25.04.2009

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


Mam problem wynikający z braku doświadczenia. Już wcześniej się z nim spotykałem ( nie warto pisać jak go rozwiązywałem) teraz chciałbym dowiedzieć się jak to powinno być implementowane.
Problem dotyczy prawie każdej bazy danych, bo do każdej stworzona jest klasa do obsługi(API -> PDO, MongoClient, Predis ).
I teraz pytanie brzmi jak tego używać ? W przykładzie posłużę się Predis.
https://github.com/nrk/predis
  1. //przykładowy kod index.php
  2. Predis\Autoloader::register();
  3. ...
  4. $redis = new Predis\Client();
  5. $redis->get(variable);
  6. ...//tutaj peracje na $redis
  7. $user = new user();
  8. class user(){
  9. function __construct(){
  10. $id = $_SESSION[user];
  11. //zmieniliśmy środowisko i zmienna $redis jest tutaj niedostępna
  12. //tutaj chce pobrać z Redis wartość która kryje się pod kluczem $id;
  13. $redis = new Predis\Client(); //niestety muszę tworzyć nową instancje
  14. $this->userName = $redis->get($id);
  15. }
  16. }

Rozwiązanie w którym w każdym miejscu gdzie będę chciał użyć redis muszę tworzyć nową instancje redis wydaje mi się dziwne. Każda z takich bibliotek powinna być obudowana własną która implementuje daną bibliotekę jako singleton ?

Nie potrzebuje dokładnej odpowiedzi jak to powinno być zrobione.
Np wystarczy mi wasze doświadczenie. Jak wy używacie PDO ?

Ten post edytował tadeurz 21.07.2013, 08:58:19
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
Wazniak96
post
Post #2





Grupa: Zarejestrowani
Postów: 550
Pomógł: 75
Dołączył: 5.06.2012
Skąd: Lębork

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


Podaj obiekt bazy danych jako argument do konstruktora klasy i utwórz z niego prywatny obiejt tej klasy.

Czyki przykładowo;
  1. $db = new PDO(); //w skrucie...
  2.  
  3. $user = new user($db);
  4.  
  5. class user
  6. {
  7. private $db;
  8.  
  9. function construct($db)
  10. {
  11. $this->db = $db;
  12. }
  13. }
Go to the top of the page
+Quote Post
tadeurz
post
Post #3





Grupa: Zarejestrowani
Postów: 70
Pomógł: 1
Dołączył: 25.04.2009

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


Tak mogę tak zrobić.
W takim przypadku w konstruktorze każdej klasy wymagającej $redis musiałbym dodawać argument, lub dziedziczyć tą klasę z klasy gdzie ten obiekt jest już dostępny. (IMG:style_emoticons/default/tiredsmiley.gif)

Do tej pory najbardziej przekonany jestem do zrobienia z $redis obiektu globalnego.
Go to the top of the page
+Quote Post
Wazniak96
post
Post #4





Grupa: Zarejestrowani
Postów: 550
Pomógł: 75
Dołączył: 5.06.2012
Skąd: Lębork

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


Singleton też nie jest złym rozwiązaniem z tego co się orientuję.

Tutaj nie ma co marudzić tylko przerabiać jeżeli chce się mieć poprawnie.

Ten post edytował Wazniak96 21.07.2013, 07:47:47
Go to the top of the page
+Quote Post
Daiquiri
post
Post #5





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




To czy zrobisz to za pomocą wstrzykiwania (z wykorzystaniem metody, atrybutu lub przez konstruktor) czy jak wspomniano sprawisz, że klasa dla której wywołujesz nową instancję najpierw sprawdzi czy już takiej nie ma, żeby ją zwrócić - nie jest istotne.... bo zawsze będzie to lepsze od obiektu globalnego (IMG:style_emoticons/default/wink.gif) .

Nie znam całej apki, ale przecież nie wszędzie potrzebujesz dostępu do $redis no i często klasy logiki i tak dziedziczą.

No i przede wszystkim: Temat: Jak poprawnie zatytulowac watek
Go to the top of the page
+Quote Post
tadeurz
post
Post #6





Grupa: Zarejestrowani
Postów: 70
Pomógł: 1
Dołączył: 25.04.2009

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


Czyli:
-> GLOBAL jest złym pomysłem, jak zawsze zresztą (IMG:style_emoticons/default/biggrin.gif)
-> tworzenie nowej instancji obiektu za każdym razem też jest złe $redis

Wstrzyknięcie $redis to jakiegoś commonAction/commonModel to dobry pomysł.

Ten post edytował tadeurz 21.07.2013, 09:07:02
Go to the top of the page
+Quote Post
Daiquiri
post
Post #7





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Wstrzyknięcie lub po prostu tworzysz coś na kształt:
Kod
if (nie mam własnej instancji)
{
    stwórz instancję;  
    zapisz ją do statycznego atrybutu $redis;
    zwróć $redis;
} else
{
    zwróć $redis;
}
dla klasy typu redis z prywatnym konstruktorem (żebyś się przypadkiem nie zagalopował) i statyczną metodą + statycznym atrybutem $redis, w którym przechowujesz instancję.

Wtedy z każdym wywołaniem klasy redis nie stworzysz nowego obiektu (bo nie jest to możliwe) i dostaniesz ten sam. Możesz to organizować w kontenerach lub nie, w zależności od potrzeb.
Go to the top of the page
+Quote Post
tadeurz
post
Post #8





Grupa: Zarejestrowani
Postów: 70
Pomógł: 1
Dołączył: 25.04.2009

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



Pod dłuższym zastanowieniu i próbie przelania tego na kod nie pozostaje nic innego jak zrobić z tego to o czym Ty piszesz : singleton. A forma jego wstrzyknięcia pozostaje do wyboru.
Mylę się czy zdanie w pierwszym poście jest bardzo dobrym spostrzeżeniem/radą ?

Cytat(tadeurz @ 20.07.2013, 21:41:09 ) *
Rozwiązanie w którym w każdym miejscu gdzie będę chciał użyć redis muszę tworzyć nową instancje redis wydaje mi się dziwne. Każda z takich bibliotek powinna być obudowana własną która implementuje daną bibliotekę jako singleton ?
Go to the top of the page
+Quote Post
Daiquiri
post
Post #9





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Nie wiem za bardzo co masz na myśli w tym zdaniu (IMG:style_emoticons/default/smile.gif) . Jeżeli klasę redis masz już podpiętą, to nie musisz jej nigdzie wstrzykiwać. W klasie, w której jest potrzebna wywołujesz np. redis::getInstance() i jako zwrot otrzymujesz instancję.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 22:31