Při tvorbě každé trochu rozsáhlejší aplikace (nejen) v PHP budete postaveni před problém, jak pro ni co nejlépe vytvořit komfortní konfigurační soubor. Proč k tomu nevyužít XML, které nám přináší velmi jednoduchou možnost obsluhy?

Konfigurační soubory představují množinu konstant, jejichž hodnoty poté ovlivňují chod samotné aplikace. Můžeme mít malý skript využívající jedno nebo dvě nastavení, stejně jako rozsáhlejší informační systém pracující s desítkami direktiv. V obou případech ale budeme potřebovat textový soubor s jasně danou syntaxí, který pak bude analyzován daným programem. Nyní jsme postaveni před otázku, jak má tento soubor vlastně vypadat.

Nejjednodušší možností je samozřejmě vytvořit soubor kódovaný přímo v PHP:

<?php
define(„konstanta_1“, „hodnota_1“);
define(„konstanta_2“, „hodnota_2“);

define(„konstanta_n“, „hodnota_n“);
?>

Tato možnost je dostatečná, pokud se o správu aplikace budete starat jen vy. Ale pro jiné uživatele, kteří navíc nemusí být s PHP obeznámeni, není tento formát souboru rozhodně vyhovující. Je samozřejmě možné vytvořit si vlastní syntaxi a strukturu souboru a tu poté správně interpretovat. Nabízí se ale mnohem lepší řešení, napsat si jednoduchý konfigurační soubor jako aplikaci XML!

Podpora XML v PHP

Popisovat podporu XML v prostředí PHP by bylo nošením dříví do lesa, na Intervalu na toto téma vyšlo několik článků (například Vytvoření parseru a analýza dokumentu XML či PHP a práce s dokumentem XML). Pokud si nejste příliš jisti svými znalostmi, doporučuji vám si uvedené články přečíst. V následujícím textu se již nebudu touto problematikou po teoretické stránce zabývat.

Návrh struktury dokumentu

Nejdříve si samozřejmě musíme navrhnout samotnou XML aplikaci, kterou budeme využívat pro ukládání našich dat. Nepůjde o nic složitého, neboť struktura dat je vskutku triviální, jde pouze o jména konstant a jejich hodnoty.

Jako kořenový element si zvolíme třeba identifikátor conf. Nejjednodušší možný dokument tedy může vypadat takto:

<?xml version=“1.0″ encoding=“windows-1250″?>
<conf>
</conf>

Nyní již potřebujeme element představující samotné konstanty. Dejme mu název const. Každá konstanta musí mít svůj identifikátor, v rámci tohoto dokumentu jej budeme ukládat do atributu name elementu const. Hodnota konstanty bude uvnitř tohoto elementu.

Teď si ukážeme tento námi navržený dokument v praxi. Chtějme nadefinovat dvě konstanty, MAX a POZDRAV s hodnotami 10, Ahoj:

<?xml version=“1.0″ encoding=“windows-1250″?>
<conf>
  <const name=“MAX“>10</const>
  <const name=“POZDRAV“>Ahoj</const>
</conf>

Parsování dokumentu v PHP

Strukturu XML dokumentu, máme navrženu, přejdeme tedy k nejdůležitější části celého postupu – soubor načteme, zanalyzujeme a konečně vytvoříme konstanty použitelné v PHP.

Nejdříve si vytvoříme obslužné funkce, které bude parser volat při načtení počáteční nebo koncové značky, respektive samotného obsahu elementu.

function start_element($parser, $tag, $attr)
{
  global $at, $current;
  $current=$tag;
  if (strcmp($tag, „const“)==0)
  {
    $at=$attr[„name“];
  }
}
function end_element($parser, $tag)
{
  global $current;
  $current=““;
}
function element_data($parser, $data)
{
  global $at, $current;
  if (strcmp($current, „const“)==0)
  {
    if (!defined($at))
    {
      define($at, $data);
    }
  }
}

Všechny tři funkce mají společnou globální proměnnou $current, ve které je uloženo jméno právě zpracovávaného elementu. Druhá globální proměnná $at obsahuje hodnotu atributu name právě zpracovávaného elementu const, tedy samotný identifikátor konstanty. Registrace konstanty probíhá ve funkci element_data() funkcí define().

Konfigurační utilita bude tvořena funkcí bool config(string $loc) vracející hodnotu TRUE, pokud načtení dokumentu a vytvoření konstant proběhlo v pořádku, nebo hodnotu FALSE v případě, že konfigurační soubor zadaný argumentem $loc nebyl nalezen nebo nejde o správně formulovaný (well formed) XML dokument. V jejím těle bude vytvořen samotný parser, zaregistrovány již vytvořené obslužné funkce a nakonec zanalyzován samotný dokument:

function config($loc)
{
  if (!file_exists($loc))
  {
    return 0;
  }
  else
  {
    if(!($f=fopen($loc, „r“)))
    {
      return 0;
    }
    else
    {
      $s=fread($f, filesize($loc));
      fclose($f);
      $at=““;
      $current=““;
      $parser=xml_parser_create();
      xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
      xml_set_element_handler($parser, „start_element“, „end_element“);
      xml_set_character_data_handler($parser, „element_data“);
      $res=xml_parse($parser, $s);
      xml_parser_free($parser);
      return $res;
    }
  }
}

Samozřejmě že si zdrojový kód tohoto skriptu můžete stáhnout.

Další vylepšení

Uvedená aplikace je funkční a dobře použitelná. Přesto ji lze vylepšit o několik detailů. Samotnému XML dokumentu můžete dodat vlastní DTD. Jeho vytvoření vám jistě nedá žádnou práci, neboť struktura dokumentu je velmi prostá. Určitým problémem také může být, že tento skript není úplně odolný vůči všem uživatelským výstřelkům. Stálo by za to alespoň nějakým způsobem kontrolovat data načtená z konfiguračního souboru. Popsané změny a vylepšení jsou natolik jednoduché, že je již nechám na vás.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět