Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Archiwum Pro _ Dylematy co do konfiguracji w FW

Napisany przez: menic 11.01.2007, 10:58:02

Pisze własnego Fw na osobiste potrzeby, ale może kiedyś udostepnie go, ale mniejsza z tym. Zastanawiam sie jak rozwiązać konfiguracje w FW. Ogólnie pisząc dosyć mocno wzoruje sie na Symfony. Tak więc jeśli chodzi o podział konfiguracji:
-stałe "globalne" z sciezkami, rozszerzeniem plikow .class, defaultowa akcja itp.
-----
-konfiguracja samego FW
-konfiguracja aplikacji
-konfiguracja modułów
-----
I nie wiem jak najlepiej to rozwiązać. Na mysl przychodzi mi mysl aby konfiguracje trzymac w plikach .ini I tu nasuwa mi sie pytanie. Jak wydajne jest parse_ini() ? Czy może konfiguracje z .ini parsować do .php czy raczej nie ma sensu? Pliki .ini są stosunkowo łatwe w edycji. Ewwntualnie można użyć yaml winksmiley.jpg , ale to już drugorzędna kwestia. I jak teraz tu rozdzielić dostep do konfiguracji? Czy zrobić podział na np. getModuleConfig(var), getConfig(var) itp. czy np. getConfig(var, module='') Jesli przekazany zostanie jeden parametr to pobierana jest konfiguracja aplikacji/fw, a przeciwnym wypadku pobieramy konfiguracje modułu podanego jako drugi parametr.
Co wy o tym sądzicie? Chętnie poczytam jak wy rozwiązujecie tą kwestie. Wszystkie pomysły oraz wskazówki mile widziane aarambo.gif

Napisany przez: Cysiaczek 11.01.2007, 11:58:36

Już gdzieś pisałem, ale co tam : P
Mam po prostu coś na kształt rejestru.
Parę prościutkich przykładów. Korzystam z obiektu bramy o nazwie application_Helper

  1. <?php
  2. //kontekst aplikacji
  3. $AHelper->getAppRegistry()->get("appName"); 
  4. $AHelper->getAppRegistry()->get("cacheStatus"); 
  5. $AHelper->getAppRegistry()->get("TEMPLATES", "paths"); // ścieżka do katalogu templates aplikacji
  6.  
  7. //kontekst modułu (mini-aplikacji np. system newsów)
  8. $AHelper->getModRegistry($moduleName)->get("name"); 
  9.  
  10. //Można oczywiście uprościć
  11. $appConfig=$AHelper->getAppRegistry();
  12. //i stosować
  13. $appConfig->get("appName");
  14. ?>


i jeszcze metoda application_Helper::getModRegistry(). Wprowadziłem kolekcję rejestrów (bo modułów jest przecież wiele)
  1. <?php
  2. public function getModRegistry($modName=false){
  3.  
  4. if ($modName==false){
  5. $modName=$this->getReqRegistry()->get('module');
  6. }
  7.  
  8. if (http://www.php.net/isset($this->moduleCollection)){
  9. return $this->moduleCollection->getModRegistry($modName);
  10. }
  11. else{
  12. $this->moduleCollection=module_registry_Collection::getInstance();
  13. $this->moduleCollection->addModRegistry(new module_Registry($modName), $modName);
  14. }
  15. }
  16. ?>


Mniej więcej tak to wygląda. Mam jeszcze rejestry dla żądania (requestRegistry), sesji (sessionRegistry), ale w chwili obecnej są w fazie rozwoju i nie wiem, czy nie zmienię ich na coś innego. Nie używam natomiast globalnych stałych, choć kiedyś używałem.
Konfigurację trzymam w stringach XML, ale część (np ścieżki do katalogów) w gotowych tablicach
Polecam zatem jawne oddzielenie konfiguracji modułów od konfiguracji aplikacji.

Pozdrawiam.

Napisany przez: sf 11.01.2007, 12:39:08

Parsowanie pliku ini nie wydaje mi się, aby zajmowało dużo czasu. W sumie tak miałem dotchczas to zrealizowane. Obecnie przerobiłem to na xml. Co do parsowania do pliku php to jak najbardziej tak, ale jest to kwestia na dalszy etap pracy gdy opracujesz już klase cache, aktualnie nie jest to takie istotne.

Napisany przez: marcin96 11.01.2007, 16:45:02

Cytat
Na mysl przychodzi mi mysl aby konfiguracje trzymac w plikach .ini I tu nasuwa mi sie pytanie. Jak wydajne jest parse_ini() ?


Zupełnie nie ma sensu.. wręcz nawet lepiej jest trzymać w ini niż... w zmiennych php includowanych. Zrób sobie test prosty: inlcuduj 100 razy plik php przypisujący wartości do zmiennych i parsuj 100 razy plik .ini, który zwróci takie same zmienne. Pliki ini są prostsze w interpretacji niż php i stąd (podejrzewam) różnica w czasie na korzyść .ini

Napisany przez: cadavre 11.01.2007, 19:01:54

INI vs. XML - lepiej wypada XML (benchmarki i jakość zapisu)

Jednak tak parse_ini jak i simplexml (zakładam) są rozwiązaniami wolnymi. U siebie stosuję własny parser XML'a.

Napisany przez: menic 11.01.2007, 19:06:35

Jakoś mi sie nie chce wierzyć ze XML wypada lepiej wydajnościowo od ini. dry.gif
Biorąc do kupy to wychodzi xml<ini<php Czyli xml jest szybszy od tablic php. Dla mnie jakaś paranoja...

Napisany przez: splatch 12.01.2007, 09:21:50

XML daje znacznie więcej możliwości, napisałem kiedyś http://blog.dywicki.pl/2006/09/07/dlaczego-konfiguracja-w-xml/ na ten temat

Napisany przez: Turgon 12.01.2007, 11:11:21

Powiem to tak. U mnie TurCMS (Jest tak rozbudowany że zaczyna przypominać FW) tworzy sobie podczas instalacji Obraz. Pierwsze co następuje po uruchomieniu Kernela jest odpalenie klasy TurConfig i załadowanie tego obrazu. Ja się nie bawię w jakieś tam rozdziały smile.gif Po prostu piszę nazwę zmiennej jako jej dokładny opis smile.gif :

  1. <?php
  2. /**
  3. Only to use in TurCMS or TurFramework.
  4. **/
  5. class TurConfig{
  6. private http://www.php.net/static $configurations = http://www.php.net/array();
  7.  
  8. public function __construct(){
  9. TurKernel::logMessage(get_class(),'Modul zostal uruchomiony.');
  10. }
  11.  
  12. public http://www.php.net/static final function get($confName){
  13. if(http://www.php.net/isset(self::$configurations[$confName])){
  14. TurKernel::logMessage(get_class(),'Pobrano klucz '.$confName.' z konfiguracji.');
  15. return self::$configurations[$confName];
  16. }
  17. }
  18. public http://www.php.net/static function getAll(){
  19. TurKernel::logMessage(get_class(),'Pobrano klucz wszystko z konfiguracji.');
  20. return self::$configurations;
  21. }
  22. public http://www.php.net/static final function load($confArray){
  23. self::$configurations = $confArray;
  24. TurKernel::logMessage(get_class(),'Klasa otrzymała tablicę konfiguracyjną.');
  25. return self::$configurations;
  26. }
  27.  
  28. public http://www.php.net/static final function loadFile($confPath){
  29. if(http://www.php.net/file_exists($confPath)){
  30. include_once($confPath);
  31. self::$configurations = $config;
  32. }
  33. TurKernel::logMessage(get_class(),'Klasa odczytała tablicę konfiguracyjną z pliku '.$confPath.'.');
  34. return self::$configurations;
  35. }
  36.  
  37. }
  38. ?>

Napisany przez: marcin96 14.01.2007, 16:47:41

Cytat(cadavre @ 11.01.2007, 19:01:54 ) *
INI vs. XML - lepiej wypada XML (benchmarki i jakość zapisu)

Jednak tak parse_ini jak i simplexml (zakładam) są rozwiązaniami wolnymi. U siebie stosuję własny parser XML'a.

Że co? parse_ini jest wolne? ;>) Można informacje o jakie benchmarki chodzi?

Jeśli chodzi o 'jakość zapisu' - to nas nie interesuje, bo omawiamy konfiguracje wpisywaną z palca, zatem zależy nam na jak najszybszym odczycie.

Oczywiście XML/czysty php są znacznie bardziej skalowalne - w .ini zapisać można jedynie tablicę dwuwymiarową, lecz w wielu wypadkach to zupełnie wystarczy.

Pozdrawiam ;>)

Napisany przez: cicik 15.01.2007, 19:37:15

Ja robiłem testy ale ich wyników nie podam bo nie pamiętam.
Robione były na php 5.1.x więc w miarę aktualne.
W testach brałem trzy możliwości:

- dwuwymiarowa tablica zapisana w php
- plik ini
- deserializacja wcześniej zserializowanej tablicy dwuwymiarowej

Rozwiązanie trzecie działało najszybciej ( i tego używam), rozwiązanie pierwsze - najwolniej.
Nie próbowałem na plikach XML ale biorąc pod uwagę, że stosunkowo duży odsetek czasu generowania strony zajmuje parsowanie plików językowych w standardzie TMX to rozwiązanie xmlowe wydaje mi się najwolniejsze.

Napisany przez: Cysiaczek 15.01.2007, 23:51:26

Z drugiej strony pliki XML bosko się cache'ują, więc problem szybkości odpada : D

Pozdrawiam.

Napisany przez: cicik 16.01.2007, 06:36:11

Cytat(Cysiaczek @ 15.01.2007, 23:51:26 ) *
Z drugiej strony pliki XML bosko się cache'ują, więc problem szybkości odpada : D

Pozdrawiam.


Skoro chcesz je cachowac to po co Ci one?
Nie lepiej je od razu trzymac w postaci scachowanej?

Napisany przez: Cysiaczek 16.01.2007, 11:08:40

@cicik - nie, jeśli chcesz mieć możliwość łatwej zmiany konfiguracji, a nawet posiadasz aplikację, która umożliwia zarządzanie danymi w tych plikach. Cache to raczej w tym wypadku coś a'la kompilacja.

Pozdrawiam.

Napisany przez: cicik 16.01.2007, 11:15:00

Cytat(Cysiaczek @ 16.01.2007, 11:08:40 ) *
@cicik - nie, jeśli chcesz mieć możliwość łatwej zmiany konfiguracji, a nawet posiadasz aplikację, która umożliwia zarządzanie danymi w tych plikach. Cache to raczej w tym wypadku coś a'la kompilacja.

Pozdrawiam.


No to mozna zrobic albo formularz albo skrypcik, ktory skompiluje

Napisany przez: Cysiaczek 16.01.2007, 11:30:20

Może napiszę szerzej : )

Załóżmy, że masz 10 plików XML o ustalonej strukturze i musisz je parsować (niekoniecznie wszystkie naraz). Problemem jest to, że jeden plik może odnosić się do informacji innego pliku, ten z kolei do jeszcze innych trzech plików. Taka operacja jest czasochłonna, a wystarczy, aby parser, wynik działania umieścił w tablicy. Tablica jest cache'owana i nie ma problemu. Zachowujemy ładną formę plików XML i łatwość edycji.
Pozostaje jeszcze kwestia zarządzania tymi relacjami w wielu plikach - ręcznie to masakra i nie polecam nikomu. Przy odrobinie wysiłku można jednak napisać aplikację www, która będzie czytała te pliki, sprawdzała relacje, sama aktualizowała wymagane elementy itd. itp.

Owszem, można to zrobić na INI, ale po co, jeśli XML daje większe możliwości?

Pozdrawiam.

Napisany przez: Ociu 16.01.2007, 13:58:14

Również stawiam na XML, ale nic nie przeszkadza, azby zrobić config dla wszystkich typów ( ini, xml, tablica, yaml etc. ).

Napisany przez: Strzałek 16.01.2007, 21:07:38

Zaczynałem na stałych, później tablice, następnie ini, by skończyć na xml.

Uważam to za najlepsze rozwiązanie, które sam stosuje. Przede wszystkim xml daje mi dużoooo większe możliwości.
Parsuje plik, robie cache i jazda.

Może nawet notkę dla początkujących na blogu napiszę winksmiley.jpg

Napisany przez: menic 3.03.2007, 14:34:29

Problem, przechowywania konfiguracji jest zalatwiony. Ale głownym tematem dyskusji jest logiczny podział konfiguracji smile.gif Tzn jak sie odwolywac do poszczegolnych jej czescj jak konfiguracja FW, aplikacji oraz modulu smile.gif

Mam taki dylemat. Czy widok powinien miec dostep jakos do konfiguracji czy nie? Wg mnie nie, ale czasem wygodniej jets jak ma. Tak wiec czy pozwolic widokowi na odczytywanie konfiguracji czy zamiast w tego w akcji deklarujemy jakie wartosci konfiguracji beda potrzebne widokowi i je przesyłamy?
EDITED
Juz wybrałem. Widok dostaje to co zadeklarujemy dla niego w akcji + wartości systemowe, takie jak nazwa aktualnej akcji itp. smile.gif

No ale mam jeszcze jeden maly dylemat. Czy konfiguracje pobierac za pomoca $this->getConfig('var') czy tez moze przez $this->config->var ? Jakie jest wasze zdanie ? smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)