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:
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:
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:
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:
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