NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

Lekce 6 - Práce se soubory INI v PHP

V předešlém cvičení, Řešené úlohy k 3.-5. lekci práce se soubory v PHP, jsme si procvičili nabyté zkušenosti z předchozích lekcí.

V této lekci se podíváme na formát souboru INI a ukážeme si, jak se s ním pracuje. Název INI pochází z angličtiny, ze slova Initialization (česky inicializace), které můžeme chápat jako přiřazení hodnot.

Jestliže jste někdy ve svých webových aplikacích potřebovali databázi, pravděpodobně jste použili MySQL, která je velmi populární zejména mezi začínajícími vývojáři, ale ani pokročilí jí nepohrdnou. Podporuje totiž velkou část standardu SQL, což je vynikající jazyk pro práci s databází, ale pro některá úložiště typu klíč=hodnota je to pověstný kanón na vrabce.

Pokud jste se někdy zabývali konfigurací (obzvláště velmi starých verzí) Windows a nebo také her, pravděpodobně jste na soubory s příponou .ini již narazili. Jedná se o obyčejný textový soubor s jednoduchou vnitřní strukturou ve tvaru klíč=hodnota, ve kterém jsou jednotlivé záznamy odděleny novým řádkem.

Taková databáze vyniká hlavně svou jednoduchostí. Jestliže si někdy budeme chtít např. poznamenat přístupové údaje k velké databázi, sepsat seznam chybových hlášení v různých jazycích, a přitom tyto údaje nebudeme chtít vkládat přímo do skriptů, protože je dobré oddělovat program od dat, databáze v souboru INI může určitě přijít vhod.

Typy souborů INI

Soubory INI dělíme podle jejich vnitřní struktury na:

  • ploché a
  • rozdělené do sekcí.

Ploché soubory INI

Vytváření základních plochých souborů INI je velmi jednoduché a stačí nám k tomu libovolný textový editor:

host=localhost
user=kit
pass=kitovoheslo
name=test

Soubor si můžeme uložit třeba pod názvem .htdata.ini, protože .ht na začátku názvu v případě webového serveru Apache (většinou – záleží na konfiguraci) zajistí, že si tento soubor nikdo nebude moci zobrazit v prohlížeči. Možností pro skrytí souboru je však víc.

Potom nám již stačí v PHP souboru přečíst a zpracovat soubor INI pomocí funkce parse_ini_file():

$mysql = parse_ini_file('.htdata.ini');
// hlavičku nastavíme, ať se nám hezky vypíše pole
header("Content-Type: text/plain; charset=UTF-8");
print_r($mysql);

Ano, to je vše. Je to takto jednoduché. Vrácené asociativní pole si poté vypíšeme např. funkcí print_r(), jejíž výstupem bude:

Plochý INI
localhost

Jak je to s rychlostí? Datový soubor, který měl 100 kB (2000 klíčů) mi PHP načetlo za cca. 10 ms. Co se týče počtu klíčů, jedná se spíše o horní limit. Více konfiguračních parametrů webové aplikace stejně ani nemívají. Pro chybová hlášení může být toto limitní číslo klidně i vyšší.

Soubory INI se sekcemi

Struktura dat nemusí být jen plochá, ale je možné použít ještě jednu úroveň zanoření. Soubor INI si můžeme rozdělit do sekcí:

[MySQL]
host=localhost
user=kit
pass=kitovoheslo
name=test

[PgSQL]
host=localhost
user=kit
pass=pgheslo
name=testpg

PHP skript na čtení a výpis tohoto souboru bude vypadat velmi podobně. Jedinou změnu, kterou musíme udělat, je předat kladnou hodnotu v druhém argumentu funkce parse_ini_file(), která říká, že chceme v souboru zpracovávat sekce:

$inidata = parse_ini_file('.htdata.ini', true);
// hlavičku nastavíme, ať se nám hezky vypíše pole
header("Content-Type: text/plain; charset=UTF-8");
print_r($inidata);

Výstupem bude toto:

Sekce
localhost

Vzniklo nám dvojrozměrné asociativní pole, které většinou vystačí i pro složitější konfigurační soubory.

Existují způsoby, jak z PHP skriptů soubory INI vytvářet a měnit. Obecně tento postup ale nemohu doporučit. Obvyklejší je takový soubor připravit na PC a na server zkopírovat. Koneckonců jsme si říkali, že tento formát souborů se hodí primárně na ukládání konfiguračních parametrů, které obvykle nepotřebujeme programově měnit.

Zmiňovali jsme se o vícejazyčných verzích webu. V takovém případě jen stačí vytvořit patřičný počet souborů (nebo jeden soubor s více sekcemi), přičemž v každém z nich bude slovník hesel v jednom jazyce. Funkce parse_ini_file() pak jen podle zvoleného jazyka klienta otevře ten správný soubor nebo sekci. Pak už je jen na aplikaci, jak s vráceným polem naloží.

Vlastnosti souborů INI

Než lekci ukončíme, seznámíme se ještě s několika vlastnostmi INI souborů, jejichž znalost by se při jejich vytváření mohla hodit :-)

Komentáře

Komentáře uvozujeme středníkem (;) na začátku řádku. Řádky s komentáři budou ignorovány a můžeme si do nich zapsat informace usnadňující orientaci v souboru:

[Sekce]
; MYSQL heslo (hlavní)
password=3]T/n*pLu}.$83R!
; MYSQL heslo (záložní)
password2=Hb@S"X7x5(F(}(3z

Některé implementace považují za komentáře také řádky začínající na křížek, neboli jak by řekli uživatelé Instagramu, hashtag (#), ale u současných verzí PHP tomu tak není.

Duplicitní položky

Jestliže PHP předáme soubor INI, který obsahuje více stejných klíčů v jedné sekci nebo více stejně pojmenovaných sekcí, ve výsledném poli objevíme pouze tu poslední, která se v souboru nacházela. V jiných implementacích tomu může být ale jinak, takže bychom se na toto chování neměli nikdy spoléhat:

[MySQL]
password=heslo

[MySQL]
password=123456
; pouze heslo níže se objeví v poli
password=opr4vd0v3H3sl0

Po zpracování takového souboru bude výsledek teda takovýto:

Duplicitní položky
localhost

Citlivost na velikost písmen

PHP bere v souborech INI ohled na velikost písmen v názvech sekcí a klíčích. Je tedy tzv. case-sensitive. Například implementace ve Windows API se ale takto nechová a opět je to tedy věc, na kterou není dobré se spoléhat:

[MYSQL]
password=heslo

[MySQL]
PASSWORD=123456
password=opr4vd0v3H3sl0

Výstup po parsování bude tedy tento:

Case-sensitive písmen
localhost

Výhody a nevýhody použití souborů INI

Použití INI souborů jako databáze může být výhodné, když:

  • potřebujeme načíst konfigurační data, která nechceme mít vložená přímo v PHP skriptech,
  • potřebujeme použít většinu načtených dat, např. do šablony,
  • dat není mnoho,
  • chceme mít možnost data jednoduše editovat, a to třeba i z terminálu přímo na serveru,
  • data budou používána jen výjimečně, např. pro chybová hlášení,
  • potřebujeme data, která budou dostupná i v případě nedostupnosti hlavní databáze.

Vše má ale i své proti. Tuto databázi nebudeme zpravidla chtít využívat, jestliže:

  • je dat mnoho,
  • potřebujeme číst jen některá data,
  • potřebujeme data vyhledávat i jinak než podle primárního klíče,
  • chceme data programově měnit přímo z PHP skriptů.

Těch pět řádků zdrojového kódu z lekce najdete jako vždy níže ke stažení.

V další lekci, Práce s archivy ZIP v PHP, se seznámíme s prací s archivy ve formátu ZIP v PHP. Ukážeme si třídu ZipArchive a její nejdůležitější metody.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 23x (1.6 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

Předchozí článek
Řešené úlohy k 3.-5. lekci práce se soubory v PHP
Všechny články v sekci
Soubory a práce s nimi v PHP
Přeskočit článek
(nedoporučujeme)
Práce s archivy ZIP v PHP
Článek pro vás napsal Kit
Avatar
Uživatelské hodnocení:
21 hlasů
Jsem spokojeným uživatelem operačních systémů založených na linuxovém jádře. Zejména openSUSE a Ubuntu. Pro psaní veškerých textů a programů používám vynikající textový editor Vim. Aplikace se snažím psát vždy v tom nejvhodnějším programovacím jazyk...
Aktivity