Parsare fisiere ini in PHP

Read this post in English

Share on:

De ce fisiere “ini”? Pentru ca sunt mult mai comode! Majoritatea serverelor din lumea *nix au fisiere de configurare de tip “ini” sau “conf”. In lumea PHP preferate sunt fisierele de configurare PHP, care in general sunt array-uri. Nu ar fi mult mai elegant sa fie un fisier ini care sa nu fie imbricat in cod PHP?

Din fericire PHP dispune de doua functii native care pot realiza acest lucru: parse_ini_file si parse_ini_string.

Principiul este foarte simplu, se da un fisier de configurare ini si functia va intoarce un array.

Un mic exemplu:

 1;config.ini
 2
 3[simple]
 4number = 1
 5another = 2
 6fraction = 0.2
 7
 8[escape]
 9path = /usr/bin/php
10url = https://blog.claudiupersoiu.ro
11error = '<a href="%path%">%error%</a>'
12
13[array]
141 = a
152 = b
163 = c

Pentru a parsa fisierul anterior:

1$config = parse_ini_file('config.ini', true);
2var_dump($config);

Parametrul al doilea specifica daca sectiunile vor deveni chei in array. Sincer nu vad in ce moment nu ar fi asta util.

Pare costisitor? De fapt pentru fisierul de mai sus este mai ieftin ca timp sa il parsezi din ini decat sa incluzi un array gata parsat. Diferenta pe calculatorul meu este de ~0.00002.

Dar fisierul de sus nu este tocmai mare, asa ca sa trecem la un fisier ini serios, cum ar fi php.ini. Aici diferenta a fost mai mare in favoarea array-ului care a castigat cu un avantaj de ~0.0003, adica aproximativ jumatate din parsare care a fost ~0.0006.

Avand in vedere ca masina mea este destul de puternica si multe cereri concurente pot adauga un overhead pentru un fisier mare, uneori este util un cache intr-un fisier de configurare.

Din fericire acest lucru este simplu de realizat in PHP.

1$cache = var_export($config, true);
2
3file_put_contents('cache/config.php', "<?php\n\$config = " . $cache . ';');

Acum nu mai trebuie inclus decat fisierul cache/config.php si evident regenerat atunci cand fisierul ini este modificat.

PHP trebuie sa aiba drept de scriere in directorul cache.