Wojciech Gomoła

Wojciech Gomoła Now is my Time

Temat: "Prawie absolutna obiektowość" a wydajność w PHP

Robię mały projekcik do celów związanych tylko z nauką na uczelni. Staram się żeby treści strony nie ładować bezpośrednio z bazy a odczytywać z obiektów bazodanowych. Obiekt taki odpowiada jednemu rekordowi w bazie, ładuje się gdy jest potrzebny, można na nim dokonywać przekształceń i ewentualnie zrzucić do bazy.
W tej chwili "cache"'uje takie obiekty w tablicy (tak żeby jeden obiekt nie ładował się 10 razy) jednak zastanawiam się czy przy większej ilości obiektów wyszukiwanie odpowiedniego obiektu w tablicy nie będzie wolniejsze od ponownego załadowania go z bazy? Czy ktoś z was robił już coś takiego? jeśli tak to do jakich wniosków doszedł?
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: "Prawie absolutna obiektowość" a wydajność w PHP

Chodzi Ci o Object-Relational Mapping? Jeśli masz jakieś wątpliwości to spójrz w kod Doctrine albo Propela :-)

konto usunięte

Temat: "Prawie absolutna obiektowość" a wydajność w PHP

Ano, spojrz na sposoby realizowania tzw. DAO (nie mylic z Tao :P).
I polecam odwzorowywac cala tabele w obiekt :)

Edit:
Btw. jezeli poprzez "ladowanie" sie obiektu rozumiesz jego tworzenie to tez poczytaj o wzorcu Singleton.Marcin Olichwirowicz edytował(a) ten post dnia 03.12.08 o godzinie 22:35
Wojciech Gomoła

Wojciech Gomoła Now is my Time

Temat: "Prawie absolutna obiektowość" a wydajność w PHP

Marcin Olichwirowicz:
Ano, spojrz na sposoby realizowania tzw. DAO (nie mylic z Tao :P).
I polecam odwzorowywac cala tabele w obiekt :)

Edit:
Btw. jezeli poprzez "ladowanie" sie obiektu rozumiesz jego tworzenie to tez poczytaj o wzorcu Singleton.Marcin Olichwirowicz edytował(a) ten post dnia 03.12.08 o godzinie 22:35

Singleton nie do końca pasuje bo ma być wiele obiektów jednego typu zastanawiam się tylko czy jak potrzebuję informacji o kliencie o id = 1528 to utworzony obiekt trzymać w pamięci bo "może się przydać" czy zwalniać go i drugi raz wczytać gdy będzie potrzebny.

Ładowanie nie jest jednoznaczne z utworzeniem, czasami będą tworzone obiekty "Czasu wykonania" Np przy dodawaniu nowego klienta odwołanie do bazy zostanie wykonane dopiero przy zapisie.
Łukasz Ważny

Łukasz Ważny winning doesn't
really matter as
long as you win

Temat: "Prawie absolutna obiektowość" a wydajność w PHP

Jak najbardziej takie obiekty trzymaj w cache'u. Zwłaszcza jeśli zamierzasz korzystać z danych jednego obiektu kilkakrotnie podczas wyświetlenia strony.

Pobranie z bazy + proces hydratyzacji będzie zawsze wolniejszy od sięgnięcia po gotowy obiekt z tablicy.

Warto popatrzeć co się dzieje w PHP Doctrine, jak implementować własne rozwiązanie to tylko z PDO + FETCH_CLASS lub FETCH_INTO :>

konto usunięte

Temat: "Prawie absolutna obiektowość" a wydajność w PHP

Wojciech Gomoła:

Singleton nie do końca pasuje bo ma być wiele obiektów jednego typu zastanawiam się tylko czy jak potrzebuję informacji o kliencie o id = 1528 to utworzony obiekt trzymać w pamięci bo "może się przydać" czy zwalniać go i drugi raz wczytać gdy będzie potrzebny.


Pytanie czego Ci będzie bardziej brakować ramu ( obiekty w pamięci ) czy procesora ( męczenie bazy danych ).
Poza tym czas życia procesu php jest zbyt mały żeby się zastanawiać nad zwalnianiem pamięci w trakcie.
Podoba mi się idea trzymania niektórych obiektów z ORMa w ramie dla innych wywołań strony (np przy użyciu memcached)
Piotr P.

Piotr P. Software Developer

Temat: "Prawie absolutna obiektowość" a wydajność w PHP

Michał Wujas:
Wojciech Gomoła:

Singleton nie do końca pasuje bo ma być wiele obiektów jednego typu zastanawiam się tylko czy jak potrzebuję informacji o kliencie o id = 1528 to utworzony obiekt trzymać w pamięci bo "może się przydać" czy zwalniać go i drugi raz wczytać gdy będzie potrzebny.

Rozwiń myśl "może się przydać". Tworzenie keszu tak na zaśke jest bez sensu IMO. Albo wiesz po co robisz ten kesz albo go nie robisz w ogóle.
Podoba mi się idea trzymania niektórych obiektów z ORMa w ramie dla innych wywołań strony (np przy użyciu memcached)

Ale to też zajmuje pamięć i czas procesora. Memcache nie przechowuje obiektów i danych ale ich dokładne kopie. Oczywiście jest to tak czy siak szybsze niż pobieranie danych z bazy :)
Tomasz Skaraczyński

Tomasz Skaraczyński projektant,
programista, ATP
Skaraczyński Tomasz

Temat: "Prawie absolutna obiektowość" a wydajność w PHP

Wojciech Gomoła:
zastanawiam się tylko czy jak potrzebuję informacji o kliencie o id = 1528 to utworzony obiekt trzymać w pamięci

Jeżeli wiesz jakie id mają obiekty to czemu nie zaindeksować elementu tablicy takim właśnie id-kiem. Wtedy obiekt ładujesz raz a wyszukiwanie jest banalne.

Ponadto, jeżeli dla obiektów różnych klas mogą się powtarzać idki. To tablicę indeksowaną w ten sposób możesz zawsze schować w obiekcie nadrzędnym i uzyskiwać dostęp do załadowanego obiektu przy pomocy obiektu nadrzędnego.

Możesz też robić klasę frontową dla grupy obiektów. Dla przykładu, masz obiekt Pracownik i klasę frontową Pracownicy. W tej klasie przechowujesz tablicę z utworzonymi już obiektami pracowników. Elementy oczywiście indeksowane kluczem z bazy. Do klasy Pracownicy dodajesz metodę getPracownik($id) i to klasa ta pilnuje czy podać obiekt z tablicy czy trzeba czytać z bazy.

Metod jest sporo. Ja zwykle w aplikacjach staram się utrzymywać w pamięci obiekty, które mogą mi być potrzebne.

Następna dyskusja:

Dwa interpretery php a wyda...




Wyślij zaproszenie do