Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Częste odczytywanie danych z bazy lub pliku XML
Forum PHP.pl > Forum > PHP
edox
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ć?
wrzasq
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
zimi
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?
ucho
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 :/
legorek
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
zimi
@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...
legorek
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.
zimi
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
edox
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
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-2025 Invision Power Services, Inc.