Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 5 - Práce se soubory INI v PHP

V předešlém cvičení, Řešené úlohy k 3.-4. 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é ve zkratce znamená 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ě ve své jednoduchosti. 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 INI souborů

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

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

Ploché INI soubory

Vytváření základních plochých INI souborů 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 soubor přečíst a zpracovat pomocí funkce parse_ini_file():

$mysql = parse_ini_file('.htdata.ini');
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:

Array
(
    [host] => localhost
    [user] => kit
    [pass] => kitovoheslo
    [name] => test
)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Jak je to s rychlostí? Datový soubor, který měl 100 kB (2000 klíčů) mi PHP načetlo za cca 10 ms. Co do počtu klíčů bych to bral jako 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šší.

INI soubory 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);
print_r($inidata);

Výstupem bude toto:

Array
(
    [MySQL] => Array
        (
            [host] => localhost
            [user] => kit
            [pass] => kitovoheslo
            [name] => test
        )

    [PgSQL] => Array
        (
            [host] => localhost
            [user] => kit
            [pass] => pgheslo
            [name] => testpg
        )
)

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 INI souborů

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í)
[email protected]"X7x5(F(}(3z

Některé implementace považují za komentáře také řádky začínající na křížek, neboli jak by řekli instagrameři - 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=heslo1

[MySQL]
password=heslo2
; pouze heslo3 se objeví v poli
password=heslo3

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

Array
(
    [MySQL] => Array
        (
            [password] => heslo3
        )

)

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=heslo1

[MySQL]
PASSWORD=heslo2
password=heslo3

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

Array
(
    [MYSQL] => Array
        (
            [password] => heslo1
        )
    [MySQL] => Array
        (
            [PASSWORD] => heslo2
            [password] => heslo3
        )
)

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

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ř. 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ů

Zdrojové kódy k této lekci 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 12x (2.36 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

Předchozí článek
Řešené úlohy k 3.-4. 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í:
14 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

 

 

Komentáře
Zobrazit starší komentáře (1)

Avatar
Kit
Tvůrce
Avatar
Kit:14.9.2012 6:14

Ještě se INIFILE budu jednou věnovat, tentokrát budu i zapisovat. Bude se to však dost lišit a bude to mít i jiné použití.

Uvažoval jsem ještě o ukázce objektu se slovníkem a jeho využití v Heredoc.

Odpovědět
14.9.2012 6:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
albertpatera
Tvůrce
Avatar
albertpatera:14.9.2012 15:33

ahoj, chtěl bych se zeptat, kam uložím tenhle kód, díky

$mysql=parse_i­ni_file('.htda­ta.ini');
print_r($mysql);

 
Odpovědět
14.9.2012 15:33
Avatar
user
Tvůrce
Avatar
user:14.9.2012 16:55

zajímavé, těším se na pokračování :)

 
Odpovědět
14.9.2012 16:55
Avatar
Kit
Tvůrce
Avatar
Odpovídá na albertpatera
Kit:15.9.2012 10:36

Do souboru PHP. Příště zkusím poctivě dávat <?php na začátek každého skriptu.

Odpovědět
15.9.2012 10:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
albertpatera
Tvůrce
Avatar
albertpatera:15.9.2012 10:50

diky moc

 
Odpovědět
15.9.2012 10:50
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
jan.vencl
Tvůrce
Avatar
jan.vencl:13.8.2013 17:32

Velice pékně :)) , mám dotaz jake by si poradil ten zápis do souboru aby to bylo co nejrychlejší? nebo jinak nemáš na to nějakou třídu:)

 
Odpovědět
13.8.2013 17:32
Avatar
Kit
Tvůrce
Avatar
Odpovídá na jan.vencl
Kit:13.8.2013 18:17

Pokud chceš přepsat kompletně celou databázi, můžeš třeba použít běžnou funkci file_put_conten­ts(), ale pokud chceš měnit jen jednotlivé záznamy, tak je vhodnější otevřít pomocí dba_open(), přepisovat je dba_replace() a mazat dba_delete(). Tyto funkce se zároveň postarají o zamykání databáze.

Pozor, tyto funkce na INIFILE nejsou binary-safe. V záznamu nesmíš mít ani odřádkování. Na data návštěvníků se tato databáze vůbec nehodí. Spíš na uložení konfigurace.

Odpovědět
13.8.2013 18:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na jan.vencl
Kit:13.8.2013 18:22

Pokud potřebuješ, aby to bylo co nejrychlejší, použij místo INIFILE jednu z databází DB4 nebo GDBM. Rychlejší běžně dostupné databáze už neznám.

Odpovědět
13.8.2013 18:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
jan.vencl
Tvůrce
Avatar
Odpovídá na Kit
jan.vencl:14.8.2013 2:04

Já to chci hodně separovat potřebuju ty data hodně málo a to "jen" zapisování souboru stačí asi to infile,nebo jinak se zeptám jak nejrychleji načíst čtyřprvkové pole a jeden string o délce asi 120znaků? Jedná se o takovej malej konfigurační soubor

Editováno 14.8.2013 2:05
 
Odpovědět
14.8.2013 2:04
Avatar
Kit
Tvůrce
Avatar
Odpovídá na jan.vencl
Kit:14.8.2013 10:06

Těch možností je hodně. INIFILE, CSV, JSON,... To vše PHP podporuje a dá se zapsat na 1-2 řádcích.

Odpovědět
14.8.2013 10:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 11. Zobrazit vše