Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Częste odczytywanie danych z bazy lub pliku XML
edox
post 9.07.2008, 06:52:27
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 6.07.2008

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


Witam,

ostatnio zacząłem trochę pisać w PHP i nurtuje mnie pewna kwestia. Czy jest sposób na umieszczenie czegoś w pamięci i odczytywanie tego potem dla wszystkich osób przeglądających nasze strony, zamiast odczytywać to za każdym razem z pliku lub bazy danych?

Konkretniej rzecz biorąc, załóżmy, że mamy serwis/grę przeglądarkową/sklep internetowy czy cokolwiek co odwiedzane jest przez dużą liczbę osób. Dajmy na to, że mamy plik XML w którym trzymamy trochę danych które wyświetlamy klientom przy pomocy JavaScriptu. Ale niektóre z tych danych potrzebne nam są gdy odnosimy się do bazy danych, a nie chcemy ich powielać i wstawiać również w bazie, bo ręczna zmiana w jednym wymuszałaby zmianę w drugim. Tak więc piszemy sobie parser XMLa w PHP i za każdym wyświetleniem strony odczytujemy dane z pliku. Wszystko fajnie, ale czy nie stałoby się to problematyczne w przypadku, dajmy na to 6000 zalogowanych użytkowników którzy klikają zakładaczki na naszych stronach? Dane wyświetlane przez JS to nie problem, bo zajmuje się tym przeglądarka każdego klienta, ale PHP obsługuje nasz serwer, więc 6000 odczytów co sekundę chyba by trochę go zmuliło. Wydaje mi się, że szybciej byłoby gdyby dane załadować do pamięci i z niej odczytywać, tylko czy jest to możliwe? smile.gif

Ps. I przy okazji, czy jest jakiś parser PHP który pozwala odczytywać dokumenty XML w sposób zbliżony do tego w JS? Czy też trzeba go sobie samemu naskrobać?


--------------------
"Czasem człowiek sądzi, że ujrzał już dno studni ludzkiej głupoty,
ale spotyka kogoś, dzięki komu dowiaduje się,
że ta studnia jednak nie ma dna."
- Stephen King
Go to the top of the page
+Quote Post
wrzasq
post 9.07.2008, 07:01:44
Post #2





Grupa: Zarejestrowani
Postów: 206
Pomógł: 18
Dołączył: 6.03.2006
Skąd: Szczecin

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


ten "sposob z JS" to po prostu DOM - Document Object Model i to standardowy sposob przetwarzania dokumentow XML chyba w niemal kazdym jezyku/srodowisku:
http://www.php.net/dom

co do problemu z przechowywaniem zmiennych w pamieci - jako-takie tozwiazanie bezposrenio nie istnieje. ale jest wiele posrednich. po pierwsze wczytane dane z XMLa mozesz przechowywac w formie juz wczytanej na przyklad przez serizalize()/unserialize(). inna mozliwoscia jest uzycie cachowania na przyklad:
http://www.php.net/manual/en/book.apc.php


--------------------
Go to the top of the page
+Quote Post
zimi
post 9.07.2008, 08:58:48
Post #3





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


Zdaję się że to też będzie pasowało choć nie używałem:
CL. Shared Memory Functions
LXXXVI. Memcache Functions

a propo korzystał ktoś z tego drugiego?
Go to the top of the page
+Quote Post
ucho
post 9.07.2008, 11:23:33
Post #4





Grupa: Zarejestrowani
Postów: 300
Pomógł: 32
Dołączył: 31.07.2006

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


Korzystałem przez jakiś miesiąc póki nie natrafiłem na dziwny błąd - dane który miał ustawioną ważność na 60 sekund nie wygasały wcale, nawet po jednej godzinie i na stronie wyświetlały się stare informacje. Po zrestartowaniu demona memcached wszystko wróciło do normy, ale wolałem wyłączyć cachowanie niż mieć takie źródło niespodzianek :/
Go to the top of the page
+Quote Post
legorek
post 9.07.2008, 11:55:11
Post #5





Grupa: Zarejestrowani
Postów: 411
Pomógł: 35
Dołączył: 27.06.2004
Skąd: Kraków

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


Nie jest rolą PHP cacheowanie danych. Od tego jest cache bazy danych, czy oprogramowanie typu squid.

Przy 6000 requestów na sekundę, będziesz potrzebował farmy serwerów cache'ująch do obsłużenia ruchu

Schemat wygląda tak w uproszczeniu tak: baza danych -> cache bazy danych -> PHP -> wynik w postaci XML -> reverse proxy -> użytkownicy


--------------------
Go to the top of the page
+Quote Post
zimi
post 9.07.2008, 14:14:21
Post #6





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


@legorek: Twoje słowa nabierają genialnego wymiaru gdy się przeczyta manual
Cytat
Memcache module provides handy procedural and object oriented interface to memcached, highly effective caching daemon, which was especially designed to decrease database load in dynamic web applications.

czyli Memcache odpowiada za cache aby zmniejszyć ładowanie danych z bazy
i na dodatek jest efektywnym program zewnętrznym
i został specjalnie do tego celu zaprojektowany (sic!)

wartość Twojej opinii staje się delikatnie mówiąc wątpliwa...

Ten post edytował zimi 9.07.2008, 14:25:08
Go to the top of the page
+Quote Post
legorek
post 9.07.2008, 16:09:07
Post #7





Grupa: Zarejestrowani
Postów: 411
Pomógł: 35
Dołączył: 27.06.2004
Skąd: Kraków

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


Cytat(zimi @ 9.07.2008, 13:14:21 ) *
@legorek: Twoje słowa nabierają genialnego wymiaru gdy się przeczyta manual

czyli Memcache odpowiada za cache aby zmniejszyć ładowanie danych z bazy
i na dodatek jest efektywnym program zewnętrznym
i został specjalnie do tego celu zaprojektowany (sic!)


Natomiast system cache który jest integralną częścią serwerów baz danych odpowiada za smażenie naleśników, a został zaprojektowany do celu budowy mostów (sic!)

Memcache to dobre i elastyczne rozwiązanie, ale podnosi stopień skomplikowania kodu i jest zbyt inwazyjny. Tj nie wprowadzisz go już do gotowego systemu.

Autorowi wątku polecam poszukać w pogooglać, ostatnio sporo jest artykułów traktujących o radzeniu sobie z dużym ruchem (chyba zainspirowanych naszą klasą). Prawda jest też taka, że nie ma wielu specjalistów którzy mają doświadczenie z takimi obciążeniem, a pytanie kierowałbym raczej do adminów niż do programistów.

Rozpisałbym się jeszcze, ale muszę poprzewracać naleśniki zanim MySQL je przypali.

Ten post edytował legorek 9.07.2008, 16:09:46


--------------------
Go to the top of the page
+Quote Post
zimi
post 9.07.2008, 16:24:33
Post #8





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


ok ale autor wspomniał o pliku xml i cache'm co tutaj ma być?
rolą PHP jest spełniać to co mu napiszesz aby spełniał...

Cytat
Natomiast system cache który jest integralną częścią serwerów baz danych odpowiada za smażenie naleśników, a został zaprojektowany do celu budowy mostów (sic!)

smile.gif
wiadomo że memcache jest po to żeby był cache, chodzi mi raczej o to że memcache został zaprojektowany po to by zdjąć obciążenie z SZBD

co do reszty się zgadzam
Go to the top of the page
+Quote Post
edox
post 15.07.2008, 20:20:11
Post #9





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 6.07.2008

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


Dzięki za podpowiedzi smile.gif Zdecydowałem się wykorzystać APC, jakoś tak najprzyjemniej wyglądał tongue.gif

W sumie nie wiem, czy to co robie ma sens. Generalnie mam plik XML, będzie w nim duży element, który będzie miał około 20 dzieci i każdy z nich również około 5 dzieci. Będzie to plik który nie będzie się raczej zmieniał, służyć ma po prostu przetrzymywaniu stałych danych w przejrzysty sposób (zamiast grzebać w kodzie skryptów) i ułatwić ewentualne bardzo sporadyczne zmiany. Do tego ewentualne zmiany w nim dokonywane przez osoby 3 nie będą wymagały znajomości SQLa (dlatego plik XML zamiast tabeli w bazie danych) no i najważniejsze, nauczę się wykorzystywać XMLa ^^

W każdym razie ten plik będzie zawsze odczytywany podczas wejscia na daną podstronę, doszedłem więc do wniosku, że zamiast odczytywać za każdym razem dane z pliku XML, mogę wrzucić dane do RAMu i stamtąd je odczytywać. Ale brak mi doświadczenia w programowaniu, więc nie wiem czy mój pomysł ma sens tongue.gif


--------------------
"Czasem człowiek sądzi, że ujrzał już dno studni ludzkiej głupoty,
ale spotyka kogoś, dzięki komu dowiaduje się,
że ta studnia jednak nie ma dna."
- Stephen King
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 10:49