Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Konfiguracja frameworka w XML
squid
post
Post #1





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


Szukam sposobu na konfiguracje frameworka. stwierdzilem ze konfiguracji moze byc tak duzo ze sesnownie byloby wykorzystac plik xml to trzymania konfiguracji.
Tu meczy mnie kilka watpliwosci, ktroe mam nadzieje pomozecie mi rozwiac.

Jak czytac plik konfiguracyjny XML. Waham sie miedzy PEAR::Config a SimpleXML z php5 a mmoze warto siegnac po inne rozwiazanie.

Druga sprawa to wydajnosc. Oczywiscie szkoda by bylo zeby kazde wywolanie strony wizalo sie z przetworzeniem XML'a wiec wymyslilem sobie ze sprasuje plik tylko przy pierwszym ladowniau i umieszcze go w tablicy $_SESSION albo stworze obiekt do ktorego wrzuce konfiguracje i umieszcze calosc w zmiennej sesji.

Powiedzcie mi czy moje myslenie idzie w dobrym kierunku i jak Wy to robicie.
Bede tez wdzieczny za linki smile.gif


--------------------
Jeśli życie to kara to nieźle nabroiłem ;-)
Go to the top of the page
+Quote Post
3 Stron V   1 2 3 >  
Start new topic
Odpowiedzi (1 - 19)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Co do wydajności. Przy pierwszym wczytaniu xml załaduj go do cache. Sesja będzie trzymala xml tylko dla danego gościa. Kolejny gostek bedzie musial znowu wczytywac xml. Cache będzie dzialal dla każdego. W przypadku zmiany konfiguracji wystarczy tylko cache usunąć.
Jest parę bibliotek do cache - poszukaj


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
squid
post
Post #3





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


Cytat(nospor @ 2005-07-04 11:44:40)
Co do wydajności. Przy pierwszym wczytaniu xml załaduj go do cache. Sesja będzie trzymala xml tylko dla danego gościa. Kolejny gostek bedzie musial znowu wczytywac xml. Cache będzie dzialal dla każdego. W przypadku zmiany konfiguracji wystarczy tylko cache usunąć.

No ale cache tez gdzies trzeba zapisac i pewnie na dysku wiec i tak bede mial odczyt z dysku co zajmuje chwile tyle ze wydaje mi sie postac bedzie inna np. tablica php a skoro tak to moze wogole lepiej trzymac konfiguracje w tablicy i tak ja stworzyc na poczatku?


--------------------
Jeśli życie to kara to nieźle nabroiłem ;-)
Go to the top of the page
+Quote Post
DeyV
post
Post #4





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




heh - ale pamietaj o 2 rzeczach.

1. Sesja również jest trzymana na dysku - w serializowanej tablicy, któa jest ładowana do pamięci w trakcie uruchamiania skrytpu.
Twoje cache może byc ładowane w identyczny sposób.

2. możesz podzielić konfiguracje na grupy, i ładować odpowiednie tylko w razie potrzeb - co jeszcze bardziej podniesie wydajność cache.


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
odczyt z dysku co zajmuje chwile tyle
Odczyt zawartości pliku jest i tak o wiele szybszy niż odczyt i parsowanie pliku xml


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
squid
post
Post #6





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


Cytat(DeyV @ 2005-07-04 11:54:33)
1. Sesja również jest trzymana na dysku - w serializowanej tablicy, któa jest ładowana do pamięci w trakcie uruchamiania skrytpu.
Twoje cache może byc ładowane w identyczny sposób.

2. możesz podzielić konfiguracje na grupy, i ładować odpowiednie tylko w razie potrzeb - co jeszcze bardziej podniesie wydajność cache.

ad. 1 - jestem tego swiadom. wiec moze skrypt powinien sprawdzac czy istnieje plik z serializowana konfiguracja jesli tak to go czyta jesli nie to przetwarza XML i zapisuje taki plik. Do serializacji uzylbym po prostu f-cji serialize.
A wracajac do sesji jesli zamisat zwyklego pliku uzylbym bazy danych do przechowywania sesji to dla duzej konfiguracji moglbym osiagnac jakies zyski czasowe?


ad. 2
no powiedzmy ze podziele sobie konfigurace ja czesci:
a) baza danych
cool.gif istniejace w systemie modele (kozystam z MVC)
c) dopuszczalne wartosci dla tablic POST i GET
d) dane dodatkowe dla konkretnego modelu

nic wiecej na razie nie trzymam w konfiguracji wiec przy takim podziale punkty a-c laduje zawsze bo sa niezbede do odslugi zapytania i d zalaczam dopiero gdy odnaleziono model. Ale dochodza mi tu dodatkowe operacje odczytu w koncu zawsze jakis podel jest wywolywany wiec w takim przypadku odczytuje 2 pliki i jeszcze musze sprawdzic czy istnieja a to kolejne dwa ruchy glowicy. Moze otwieranie jednego duzego pliku z cala konfiguracja trwa nieco mnie? chyba to przetestuje winksmiley.jpg


--------------------
Jeśli życie to kara to nieźle nabroiłem ;-)
Go to the top of the page
+Quote Post
NuLL
post
Post #7





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Cytat
A wracajac do sesji jesli zamisat zwyklego pliku uzylbym bazy danych do przechowywania sesji to dla duzej konfiguracji moglbym osiagnac jakies zyski czasowe?

Nie będzie takowych - odczyt z dysku jest szybszy niż zapytania do bazy.
Cytat
a) baza danych
istniejace w systemie modele (kozystam z MVC)
c) dopuszczalne wartosci dla tablic POST i GET
d) dane dodatkowe dla konkretnego modelu

To wszystko można zcache'wac - pozatym podpunkt cool.gif - nie lepiej to dopisać do konfigu jakieś tam akcji i każda miała by przyporządkowane potrzebne jej zmienne :?:


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
squid
post
Post #8





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


Zrobilem sobie przykladowy kod ale cos "dserializowanie" mi nie dziala, oto kod:

  1. <?php
  2. class configuration
  3. {
  4. public $conf = array ();
  5.  
  6. public function __construct ()
  7. {
  8. $cacheFile = './cache/configuration.ctmp';
  9. if ( file_exists ( $cacheFile ) )
  10. {
  11. $this->conf = unserialize ( readfile ( $cacheFile ) );
  12. var_dump ( $this->conf );
  13. echo '<p><p>';
  14. }
  15. else
  16. {
  17. $this->conf = simplexml_load_file('./xml/configuration.xml');
  18. var_dump ($this->conf);
  19. echo '<p><p>';
  20. file_put_contents ( $cacheFile, serialize ( $this->conf ) );
  21. }
  22. return true;
  23. }
  24. }
  25. ?>

a wywoluje to w innym pliku:


  1. <?
  2.  
  3. require ( './class/configuration.class.php' );
  4.  
  5. $c = new configuration();
  6. echo '<h1>test</h1>';
  7. var_dump ( $c->conf );
  8.  
  9. ?>


no ale po odczycie pliku cache i uzyciu unserialize ciagle dane sa zserializowane. Cos przeoczylem??


--------------------
Jeśli życie to kara to nieźle nabroiłem ;-)
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




readfile wyrzuca ci plik na wyjscie a zwraca liczbe a nie zawartosc pliku. uzyj file_get_contents.

pozatym sprawdz czy ci wogole w chodzi w czytanie cache:

  1. <?php
  2.  
  3. class configuration
  4. {
  5. public $conf = array ();
  6.  
  7. public function __construct ()
  8. {
  9. $cacheFile = './cache/configuration.ctmp';
  10. if ( file_exists ( $cacheFile ) )
  11. {
  12. $this->conf = unserialize ( file_get_contents ( $cacheFile ) );
  13. var_dump ( $this->conf );
  14. echo '<p>z cache</p>';
  15. }
  16. else
  17. {
  18. $this->conf = simplexml_load_file('./xml/configuration.xml');
  19. var_dump ($this->conf);
  20. echo '<p>do cache</p>';
  21. file_put_contents ( $cacheFile, serialize ( $this->conf ) );
  22. }
  23. return true;
  24. }
  25. }
  26.  
  27. ?>


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
squid
post
Post #10





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


Cytat(nospor @ 2005-07-04 14:24:35)
readfile wyrzuca ci plik na wyjscie a zwraca liczbe a nie zawartosc pliku. uzyj file_get_contents.

pozatym sprawdz czy ci wogole w chodzi w czytanie cache:

o tym zapomnialem winksmiley.jpg teraz mam tak:
  1. <?php
  2. class configuration
  3. {
  4. public $conf = array ();
  5.  
  6. public function __construct ()
  7. {
  8. $cacheFile = './cache/configuration.ctmp';
  9. if ( file_exists ( $cacheFile ) )
  10. {
  11. $string = file_get_contents ( $cacheFile );
  12. echo $string.'<p>';
  13. $this->conf = unserialize ( $string );
  14. var_dump ( $this->conf );
  15. echo '<p><p>';
  16. }
  17. else
  18. {
  19. $tmp = simplexml_load_file('./xml/configuration.xml');
  20. $this->conf = $tmp;
  21. var_dump ($this->conf);
  22. echo '<p><p>';
  23. file_put_contents ( $cacheFile, serialize ( $this->conf ) );
  24. }
  25. return true;
  26. }
  27. }
  28. ?>

czyta mi ladnie i zapisuje ale unserialize zwraca blad:
Warning: unserialize() [function.unserialize]: Node no longer exists in configuration.class.php on line 13
to samo dla lini 14


--------------------
Jeśli życie to kara to nieźle nabroiłem ;-)
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




będę strzelal, gdyż nigdy nie uzywalme simplexml_load_file. Ty chyba serializujesz referencje do obiektów (nodów), które przy wczytywaniu z cache poprostu nie istnieją, czyli ze serialize dzialalo na referencjach a nie obiektach


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
squid
post
Post #12





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


Cytat(nospor @ 2005-07-04 14:39:43)
będę strzelal, gdyż nigdy nie uzywalme simplexml_load_file. Ty chyba serializujesz referencje do obiektów (nodów), które przy wczytywaniu z cache poprostu nie istnieją, czyli ze serialize dzialalo na referencjach a nie obiektach

nie jestem pewien czy dobrze Cie rozumiem ale oto wartosc wczytana z cache:
Cytat
O:16:"SimpleXMLElement":3:{s:4:"lang";O:16:"SimpleXMLElement":1:{s:7:"default";s:2:"pl";}s:5:"ldata";a:2:{i:0;O:16:"SimpleXMLElement":3:{s:2:"id";s:2:"pl";s:6:"coding";s:10:"ISO 8859-2";s:4:"name";s:6:"Polski";}i:1;O:16:"SimpleXMLElement":3:{s:2:"id";s:2:"en";s:6:"coding";s:10:"ISO 8859-1";s:4:"name";s:7:"English";}}s:2:"db";O:16:"SimpleXMLElement":5:{s:2:"db";s:5:"mysql";s:4:"host";s:9:"localhost";s:5:"login";s:4:"user";s:4:"pass";s:4:"pass";s:8:"database";s:4:"data";}}

poza tym w manualu:
Cytat
object simplexml_load_file ( string filename [, string class_name [, int options]] )

i na stronie http://zend.com/php5/articles/php5-simplexml.php :
Cytat
With SimpleXML, element names are automatically mapped to properties on an object, and this happens recursively.

wiec wyglada to na obiekty wg mnie


EDIT:
napisalem podobna klase dla sesji:
  1. <?php
  2. class configuration2
  3. {
  4. //public $conf = array ();
  5.  
  6. public function __construct ()
  7. {
  8. $cacheFile = './cache/configuration.ctmp';
  9. if ( isset ( $_SESSION['configuration'] ) )
  10. {
  11. var_dump ( $_SESSION['configuration'] );
  12. echo '<p><p>';
  13. }
  14. else
  15. {
  16. $_SESSION['configuration'] =
  17. simplexml_load_file('./xml/configuration.xml');
  18. var_dump ( $_SESSION['configuration'] );
  19. echo '<p><p>';
  20. }
  21. return true;
  22. }
  23. }
  24. ?>

plik test.php:
  1. <?
  2.  
  3. require ( './class/configuration2.class.php' );
  4.  
  5. $c = new configuration2();
  6. echo '<h1>test</h1>';
  7. //var_dump ( $c->conf );
  8. var_dump ( $_SESSION['configuration'] );
  9.  
  10. ?>

i o dziwo tez mam problemy:
Cytat
Warning: session_start() [function.session-start]: Node no longer exists in test.php on line 5

Warning: var_dump() [function.var-dump]: Node no longer exists in class\configuration2.class.php on line 11
object(SimpleXMLElement)#1 (0) { }


sprawdzilem dla innych aplikacji ktore wczesniej dzialaly i przy wywolaniu session_start() jest tez ten problem, wyglada wiec na to ze to serwer zawodzi, zrestartowalem i nic, ktos ma pomysl jak emu zaradzic?
Uzywam php 5.0.3

Ten post edytował squid 4.07.2005, 14:12:15


--------------------
Jeśli życie to kara to nieźle nabroiłem ;-)
Go to the top of the page
+Quote Post
bela
post
Post #13


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


Eh, znany błąd, nie można serializować obiektów simplexml. Najpierw sobie to do tablicy przekonwertuj.


--------------------
Go to the top of the page
+Quote Post
squid
post
Post #14





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


Cytat(bela_666 @ 2005-07-04 16:47:11)
Eh, znany błąd, nie można serializować obiektów simplexml. Najpierw sobie to do tablicy przekonwertuj.

przegladalem changelog'a do 5.0.4 i zalatano tam kilka dziur odnosnie simpleXML ale czy zalatano i ten? bo ja niezauwazylem ale moze czytac nie umiem winksmiley.jpg

EDIT: a jak dokonac takiej konwersji z obiektu do tablicy??

Ten post edytował squid 4.07.2005, 16:01:22


--------------------
Jeśli życie to kara to nieźle nabroiłem ;-)
Go to the top of the page
+Quote Post
hwao
post
Post #15


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Przenosze.
php pro -> PHP5
czemu, chyba nie musze tlumaczyc.
Go to the top of the page
+Quote Post
bela
post
Post #16


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


Cytat(squid @ 2005-07-04 16:49:13)
Cytat(bela_666 @ 2005-07-04 16:47:11)
Eh, znany błąd, nie można serializować obiektów simplexml. Najpierw sobie to do tablicy przekonwertuj.

przegladalem changelog'a do 5.0.4 i zalatano tam kilka dziur odnosnie simpleXML ale czy zalatano i ten? bo ja niezauwazylem ale moze czytac nie umiem winksmiley.jpg

EDIT: a jak dokonac takiej konwersji z obiektu do tablicy??

Albo jakąś funkcją simplexml2array albo, co ja preferuje, wszystko po kolei parsujemy w foreach


--------------------
Go to the top of the page
+Quote Post
NuLL
post
Post #17





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


http://forum.php.pl/index.php?showtopic=25144


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
squid
post
Post #18





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


probowalem z foreachami ale tak latwo sie nie dalo, ostatecznie uzylem f-cji z manuala i wyglada to tak:
  1. <?php
  2. class configuration2
  3. {
  4. public $conf = array ();
  5.  
  6. public function __construct ()
  7. {
  8. $cacheFile = './cache/configuration.ctmp';
  9. if ( isset ( $_SESSION['configuration'] ) )
  10. {
  11. var_dump ( $_SESSION['configuration'] );
  12. echo '<p><p>';
  13. }
  14. else
  15. {
  16. $conf = simplexml_load_file('./xml/configuration.xml');
  17. //$tmp = array_values($conf);
  18. $_SESSION['configuration'] = $this->simplexml2array ( $conf );
  19. var_dump ( $_SESSION['configuration'] );
  20. echo '<p><p>';
  21. }
  22. return true;
  23. }
  24.  
  25. private function simplexml2array($xml)
  26. {
  27. if (get_class($xml) == 'SimpleXMLElement')
  28. {
  29. $attributes = $xml->attributes();
  30. foreach($attributes as $k=>$v)
  31. {
  32. if ($v) $a[$k] = (string) $v;
  33. }
  34. $x = $xml;
  35. $xml = get_object_vars($xml);
  36. }
  37. if (is_array($xml))
  38. {
  39. if (count($xml) == 0)
  40. {
  41. return (string) $x; // for CDATA
  42. }
  43. foreach($xml as $key=>$value)
  44. {
  45. $r[$key] = $this->simplexml2array($value);
  46. }
  47. if (isset($a))
  48. {
  49. $r['@'] = $a; // Attributes
  50. }
  51. return $r;
  52. }
  53. return (string) $xml;
  54. }
  55. }
  56. ?>


--------------------
Jeśli życie to kara to nieźle nabroiłem ;-)
Go to the top of the page
+Quote Post
hawk
post
Post #19





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


Całe to parsowanie XML do zserializowanej tablicy/obiektu simplexml/whatever ma na celu zwiększenie wydajności, więc simplexml2array jest IMHO błędnym rozwiązaniem.

Bo dostajesz dosyć skomplikowaną tablicę, odzwierciedlającą jakoś tam strukturę XMLa. A przecież nie potrzebujesz tablicy. Potrzebujesz obiektów skonfigurowanych za pomocą tej tablicy. Sama tablica nic nie robi. Szybciej jest zserializować gotowe do użycia obiekty, niż tworzyć je od nowa na podstawie tej tablicy za każdym razem.

Nie żebym się chwalił, ale patrz phiend2 winksmiley.jpg.
Go to the top of the page
+Quote Post
NuLL
post
Post #20





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


@hawk - załóżmy, że ten config się zmienia bądź jest zależny od jakimś parametrów - np. z konfiga o stopień wyżej - tablica się zmieni a ty znowu będziesz cache'ował kilka czy kilkanaście obiektów :?:


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
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 Aktualny czas: 19.08.2025 - 10:20