PoProstuRadek
12.02.2010, 12:57:53
Witam,
sytuacja wygląda tak : musze odczytać dane z bazy danych zapisanej w formacie .xml, która znajduje się na zewnętrznym serwerze (tzn. nie na tym, na którym działa skrypt).
Plik tej bazy zajmuje jakieś 5-6 Mb i jest ona stale uaktualniana. Mój problem polega na tym, że nie wiem jak zrealizować odczytywanie z tej bazy — tj. mam na myśli to, że zwykłe parsowanie przez np. SimpleXML nie bardzo przechodzi, bo to jednak zajmuje troche czasu, aby serwer ją załadował, odczytał dane i wyświetlił.
Jak to rozwiązać tak, aby wyświetlanie było w możliwie krótkim czasie ? Dodam, że baza ma około 100 000 linii, a chodzi tu po prostu o listę produktów sklepu (opis, cena, itp.).
Pozdrawiam,
Radek
erix
12.02.2010, 13:16:16
Klasa XMLReader dostępna w PHP.
ucho
12.02.2010, 13:25:30
Ja ściągam takie zewnętrzne pliki raz na np 30. minut i zapisuje lokalnie w postaci zserializowanej tablicy
PoProstuRadek
12.02.2010, 13:34:32
Dzięki za szybkie odpowiedzi,
@ucho : też o tym myślałem, ale jak to konkretnie robisz ? Tj. dajesz to jakoś w crona, czy jak ?
@erix : czy ta klasa rzeczywiście jest na tyle szybka ? Wybacz pytanie, ale po prostu nie zajmuje się PHP tak na co dzień.
erix
12.02.2010, 13:57:10
XMLReader jest najszybszym dostępnym sposobem odczytu plików XML w PHP, gdyż pozwala na odczyt strumieniowy i - AFAIK (ale mogę się mylić) - nie przeprowadza walidacji na starcie.
PoProstuRadek
12.02.2010, 14:00:00
No OK, ale tak się zastanawiam, bo skoro plik tej bazy zajmuje jakies 5-6 Mb, to przeciez i tak nie uniknę każdorazowego ściągania go. Wobec tego, chyba lepiej byłoby ściągać ją na dysk i co jakiś czas aktualizować. Tylko jak to zrealizować ? Pytałem o crona, jak byś to zrealizował ? Mam na myśli, żeby to ściąganie np. raz na dzień, działo się automamtycznie.
erix
12.02.2010, 14:29:27
Cytat
to przeciez i tak nie uniknę każdorazowego ściągania go
http://pl2.php.net/manual/en/xmlreader.open.php
PoProstuRadek
12.02.2010, 15:33:10
Wybacz, jesli to głupie pytanie, ale mógłbyś wytłumaczyć, co miałeś na myśli podając mi ten link ? Bo z opisu nie wynika nic konkretnego apropo ściągania/nie ściągania za każdym razem zawartości pliku.
Oczywiście, skoro XMLReader odczytuje sekwencyjnie, to pewnie nie robi tego za każdym razem "od nowa" tylko przesuwa wskaźnik pliku, ale mi chodziło o trochę co innego - o ściąganie całej bazy, co jakiś czas, automatycznie, i później o jak najszybszy odczyt z takiej lokalnej bazy.
EDIT: Dodam, że problemem staje się również serialize/unserialize - ponieważ gdy odczytuję bazę za pomocą SimpleXMLa, nie mogę później wywołać poprawnie unserialize. Zna ktoś rozwiązanie tego problemu ?
erix
12.02.2010, 19:03:42
URI -> adres -> XMLReader sam odczytuje strumieniowo dane z XML.
Potem sobie to, przy odczycie, serializujesz do tablicy i masz szybki dostęp.
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.