PHP: Databáze INIFILE

PHP Práce se soubory PHP: Databáze INIFILE

Databáze MySQL 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. SQL 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".

V PHP jsem už vyzkoušel již 11 databází s rozdílnými vlastnostmi. Některé jsou velmi dobře použitelné, některé vynikající. Také se mezi nimi vyskytl odpad, po kterém žádný rozumný vývojář nesáhne. Aby se však non-MySQL databáze uchytila, musí mít alespoň v něčem výraznou přednost.

První databází, kterou jsem vybral, je INIFILE. Možná ten název někomu připomene soubory s příponou "ini" ve Windows. Ano, je to ono. 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.

V čem je taková databáze jedinečná? V jednoduchosti! Jistě jste si už někdy potřebovali poznamenat přístupové údaje k "velké" databázi, sepsat seznam chybových hlášení v různých jazycích apod. Přitom jste to nechtěli vkládat přímo do skriptů, protože jste chtěli oddělit program od dat.

S použitím INIFILE je to velmi jednoduché. Prostě takový text napíšete v libovolném textovém editoru a necháte PHP, aby si ho přečetlo.

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

Uložil jsem si ho do souboru .htdata.ini. ".ht" na začátku názvu mi zajistí, že si tento soubor nikdo nezobrazí v prohlížeči. Možností pro skrytí souboru je však víc.

Zde je část aplikace, která si tuto konfiguraci dokáže přečíst a vypsat:

<?php
$mysql=parse_ini_file('.htdata.ini');
print_r($mysql);

Ano, to je vše. A zde je výsledek:

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

Jak je vidět, všechny hodnoty se uložily do asociativního pole $mysql připraveny k dalšímu použití. A jak je to s rychlostí? Datový soubor, který měl 100 KB (2000 klíčů) mi PHP načetlo za cca 10 ms. To bych bral jako horní limit. Pro běžné použití při pravidelném načítání bude 200 klíčů rozumná hranice. Víc konfiguračních parametrů aplikace ani nemívají. Pro chybová hlášení může být toto limitní číslo klidně i vyšší.

Struktura dat nemusí být jen plochá, ale je možné použít ještě jednu úroveň zanoření:

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

Program:

<?php
$inidata=parse_ini_file('.htdata.ini',true);
print_r($inidata);

Výstup:

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é by mohlo vystačit i pro náročné konfigurace.

Dají se najít i návody, jak dvojrozměrné pole zapsat do INI, ale obecně tento postup nemohu doporučit. Obvyklejší je takový soubor připravit na lokálním PC a na server nakopírovat.

Zmínil jsem se o multijazyčných verzích webu. Není to zas tak složité. Stačí jen vytvořit patřičný počet souborů, v každém z nich bude slovník hesel v jednom jazyku. Funkce parse_ini_file() pak jen podle zvoleného jazyka klienta otevře ten správný soubor a jeho obsah uloží do pole. Pak už je jen na aplikaci, jak s obsahem pole naloží.

Použití této databáze může být výhodné v situacích:

  • potřebuji načíst konfigurační data, která nechci mít v souborech .php
  • potřebuji použít většinu načtených dat, např. do šablony
  • dat není mnoho
  • potřebuji jednoduchou editaci prostým editorem
  • data budou použita výjimečně, např. chybová hlášení
  • potřebuji data, která budou dostupná i v případě nedostupnosti hlavní databáze

Existuje i několik proti:

  • dat je mnoho, potřebuji číst jen některá
  • potřebuji vyhledávat i jinak než podle primárního klíče
  • pořebuji často zapisovat
  • potřebuji zapisovat data od uživatelů (hrozí injection)
  • určitě by se našla i další

 

  Aktivity (1)

Článek pro vás napsal Kit
Avatar
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...

Jak se ti líbí článek?
Celkem (8 hlasů) :
55555


 



 

 

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

Avatar
Kit
Redaktor
Avatar
Kit:

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
Redaktor
Avatar
albertpatera:

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
Redaktor
Avatar
user:

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

 
Odpovědět 14.9.2012 16:55
Avatar
Kit
Redaktor
Avatar
Odpovídá na albertpatera
Kit:

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
Redaktor
Avatar
albertpatera:

diky moc

 
Odpovědět 15.9.2012 10:50
Avatar
jan.vencl
Redaktor
Avatar
jan.vencl:

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
Redaktor
Avatar
Odpovídá na jan.vencl
Kit:

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
Redaktor
Avatar
Odpovídá na jan.vencl
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
jan.vencl:

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
Redaktor
Avatar
Odpovídá na jan.vencl
Kit:

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  +1 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