“Kompilacja” pliku konfiguracyjnego – PHP

Dzisiejszy wpis ma wbrew pozorom niewiele wspólnego z tym wpisem, pomijając to, że to jakiś tam związek z plikami ini.

Najłatwiej plik konfiguracyjny jest zrobić w postaci pliku php, który sobie przyłączamy do projektu. Praktyczne nie ma z tym problemów. No może po za jednym; jak już go przyłączysz do wielu plików i w zasadzie oprzesz o niego zasadę działania całości skryptu, może się okazać, że warto by użyć owego nieszczęsnego (“wymarłego“) pliku ini do przechowywania konfiguracji.

W pierwszym odruchu chciałem parsować plik – nazwijmy go config.ini – za każdym razem i przypisywać odpowiednie wartości odczytane z niego, pewnym zmiennym dostępnym globalnie. No ale rozwiązanie to jest trochę nieoptymalnie. Stąd pomysł, by zorganizować całość na podobieństwo Smarty, czyli na podstawie pliku pliku ini generować sobie plik php do bezpośredniego przyłączenia.

Edit (2008.09.09 17:32): zaprezentowane rozwiązanie, po części wynikało z twz. “kompatybilności wstecznej”. Może być jednak ulepszone – zapoznaj się z komentarzami do wpisu.

Tak więc zakładamy, ot mamy plik ini (config.ini), mamy plik config.php który jest skryptem przeprowadzającym “kompilacje”, oraz plik który ma zostać w jej wyniku wygenerowany – config.inc.php. Tutaj uwaga: includować do skryptów będziemy tylko plik config.php.

Pierwsze co trzeba zrobić po wywołaniu pliku config.php to sprawdzić, czy mamy wygenerowany plik config.inc.php i czy ma późniejszą datę modyfikacji niż plik config.ini. Wykorzystamy do tego funkcję filemtime:

Nie trzeba sprawdzać, czy plik config.inc.php w ogóle istnieje, dzięki @ nie zgłosi ona błędu, a w wyniku da wartość FALSE (które zostanie potraktowane jako 0).

Przejdźmy do wczytania pliku konfiguracyjnego, to też trudne nie jest:

{geshi lang=php}$configArray = parse_ini_file('config.ini.php', true);

Teraz w zmiennej $configArray mamy wczytany w postaci tablicy wielowymiarowej (dzięki 2giemu parametrowi – szczegóły w opisie funkcji parse_ini_file). Otwieramy plik wynikowy:

Można zapisywać zmienne. Szkoda by jednak robić to z palca dla każdej osobno. Napisałem więc małą funkcję:

{geshi lang=php}function writeSection($defaultArray, $sectionName) { global $configArray, $configFile; foreach($defaultArray as $key => $value) { if (isset($configArray[$sectionName][$key])) $entry = $configArray[$sectionName][$key]; else $entry = $value; if (!is_numeric($entry)) $entry = '\''.$entry.'\''; fwrite($configFile, "\$$key = ".$entry.";\n"); } }

To teraz jak to działa: pierwszy parametr to tablica wartości domyślnych, drugi parametr to nazwa sekcji (konsekwencja drugiego parametru w funkcji parse_ini_file. Skupmy się na tym pierwszym. Funkcja przegląda każdą z par klucz => wartość tej tablicy, sprawdzając, czy klucz został też zdefiniowany w pliku konfiguracyjnym (config.ini). Jeśli tak, funkcja pobiera jego wartość z tablicy $configArray, jeśli nie, wstawia wartość domyślną z tablicy jaką dostarczyliśmy. Pytania?

Po co jest is_numeric?
To taka tylko zmiana w sumie kosmetyczna – sprawia, że liczby nie są zapisywane jako tekst w pojedyńczych cudzysłowach.

Czy drugi parametr jest konieczny?
Nie, ale też wczytać plik konfiguracyjny trzeba bez podziału na sekcje.

Jakiś przykład?

Trzeba pamiętać oczywiście jeszcze o zamknięciu pliku config.inc.php

{geshi lang=php}fwrite($configFile, '?>'); fclose($configFile);

To jeszcze nie wszystko w pliku config.php na końcu, za tym całym głównym ifem (patrz wyżej), trzeba wczytać plik config.inc.php:

<pre lang="php}require_once('config.inc.php'){/geshi}

To”>;

Jako komentarz nie zostanie sparsowane, a sam plik wywołany jako php wyświetli tylko średnik no i tekst komunikatu die.

Są inne metody, ale mi to akurat wystarczyło.

Zalety takiego rozwiązania, są takie, że w pliku config.ini nie trzeba zamieszczać wszystkich parametrów i ich wartości, a i tak będę one widoczne w skrypcie. Po za tym to na pewno jest ciut szybsze niż wczytywanie za każdym razem konfiguracji.

Wady: trochę to naciągane;) Nie zawsze trzeba kombinować z plikami ini.

Chętnie poczytam jakiś konstruktywnych uwag. Pozdrawiam.

Dziękuje też za nie wszystkie.

9 thoughts on ““Kompilacja” pliku konfiguracyjnego – PHP

  1. Sigvatr – nie chcę ciebie zasmucać, ale sposób który wybrałeś nie należy do najszybszych. Swojego czasu Zyx robił testy różnych sposobów zapisu konfiguracji. Odsyłam do tego wpisu: http://www.zyxist.com/pokaz.php/formaty_danych_benchmark.

    Jak wyraźnie widać, pliki PHP są parsowane dość powoli w stosunku do zserializowanych talblic zapisanych w zwykłym pliku. Polecam trzymać konfigurację właśnie w takim formacie ;). Tłumaczenie .ini do .php IMO mija się z celem – zbyt mała różnica w wydajności ;).

    Like

  2. Dzięki za link, pliki ini mają tą jedną przewagę, że bardzo "userfriendly" dla kogoś kto będzie je edytował (to był właściwie główny powód dlaczego ini). Tłumaczenie do PHP pierwotnie miało mi oszczędzi zmian w wielu plikach, gdzie w metodach i funkcjach używano "global".Poczytam o tych konfigach – jak wrócę (późnym popołudniem) – może coś dopiszę.

    Like

Comments are closed.