Leer un archivo ini o .env con PHP

Introducción

Conforme crecen nuestras aplicaciones en PHP, a veces necesitamos manejar muchas credenciales y configuraciones. Esto lo podemos hacer al leer un archivo ini en PHP.

Veamos el caso del framework Laravel, que guarda sus variables del entorno en un archivo llamado .env. No sé cómo sea parseado, pero el principio es el mismo.

Como dijimos al inicio del post, hoy veremos cómo parsear un archivo de configuración ini. Es un formato que Windows introdujo y quiere decir algo como Windows Initialization file según la Wikipedia.

Ejemplo de archivo INI

Un ejemplo (sacado de Wikipedia) podría verse así:

[Red]
; Poner UsarProxy=1 si no hay cortafuegos
UsarProxy=1
Proxy=192.168.0.1

[Preferencias]
PaginaInicio=https://wikipedia.org
Maximizar=1

Hay algunas cosas importantes:

  • Secciones: son representadas por un título encerrado en corchetes []
  • Valores: los valores que tienen la forma nombre=valor o nombre = valor o nombre = “valor”
  • Comentarios: inician con ;
  • Líneas en blanco: podemos dejar líneas en blanco, serán ignoradas al igual que los comentarios

Ahora sí vamos a interpretar un archivo ini con PHP.

Leer un archivo ini utilizando parse_ini_file

El lenguaje proporciona una función que recibe 3 argumentos: la ruta del archivo, un booleano indicando si procesará las secciones y un entero indicando el modo de lectura.

Para leer un archivo ini en PHP vamos a concentrarnos en los dos primeros argumentos, pero aquí dejo la documentación completa: PHP: parse_ini_file – Manual

Leer procesando secciones

Podemos leerlo procesando las secciones. Hablar es de mal gusto, así que vamos al código. Recordemos el archivo ini de arriba.

Suponiendo que el nombre del fichero es configuracion.ini lo leeríamos así:

<?php
$archivo = __DIR__ . "/configuracion.ini";

$contenido = parse_ini_file($archivo, true);

echo var_export($contenido, true);

Fácil y sencillo. La salida al leer un archivo ini sería esta:

array (
  'Red' =>
  array (
    'UsarProxy' => '1',
    'Proxy' => '192.168.0.1',
  ),
  'Preferencias' =>
  array (
    'PaginaInicio' => 'https://wikipedia.org',
    'Maximizar' => '1',
  ),
);

Como vemos, es un array multidimensional. Cada clave es una sección, que en este caso es Red y Preferencias. Y cada clave tiene un array con las claves indicando las configuraciones.

Por lo que si yo quisiera extraer la página de inicio, haría esto:

<?php
$archivo = __DIR__ . "/configuracion.ini";

$contenido = parse_ini_file($archivo, true);
$pagina_inicio = $contenido["Preferencias"]["PaginaInicio"];
echo "La página de inicio es: $pagina_inicio";

Lo que hay que hacer es simplemente acceder a los valores de nuestro arreglo.

Leer sin procesar secciones

Ahora supongamos que no queremos un arreglo bidimensional, sino uno sólo con claves y valores. Para ello, ignoraríamos las secciones.

Si leemos el mismo archivo con el código de abajo(notar que el segundo argumento de parse_ini_file es false)…

<?php
$archivo = __DIR__ . "/configuracion.ini";

$contenido = parse_ini_file($archivo, false);
echo var_export($contenido, true);

El resultado sería este:

array (
  'UsarProxy' => '1',
  'Proxy' => '192.168.0.1',
  'PaginaInicio' => 'https://wikipedia.org',
  'Maximizar' => '1',
)

Como vemos es un arreglo de una dimensión. Y la función puso todos los valores en él. Si queremos extraer la página de inicio haríamos esto:

<?php
$archivo = __DIR__ . "/configuracion.ini";

$contenido = parse_ini_file($archivo, false);
$pagina_inicio = $contenido["PaginaInicio"];
echo "La página de inicio es $pagina_inicio";

Nota: si encuentra claves repetidas, PHP tomará el último valor que encuentre.

Usos

En mi caso utilizo uno de estos archivos en una app para guardar mis credenciales de acceso a las bases de datos. Se ve algo así:

; <?php exit; ?>
; El comentario de arriba es para que, si el archivo es visto
; desde el navegador, se salga inmediatamente del script, ocultando
; la información que aquí existe

; En cambio, cuando es tratado como un archivo .ini, las
; líneas que comienzan con un ; son ignoradas


; Un archivo de configuración
; que guarda todas las credenciales
; para cada cosa

; Las líneas en blanco y aquellas que comienzan
; con un punto y coma (;) son ignoradas


USUARIO_MYSQL = "woopsie"
PASS_MYSQL = ""
NOMBRE_BD_MYSQL = "bla"
HOST_MYSQL = "localhost"

Sigue leyendo para saber algunas cosas sobre el primer comentario del archivo y la seguridad

Seguridad

Si exponemos este fichero al público (es decir, que sea accesible desde el navegador) recomiendo poner el siguiente comentario al inicio del archivo:

; <?php exit; ?>

Y guardar nuestro archivo con extensión php. Cuando sea interpretado como PHP, sólo imprimirá el ; pero inmediatamente se detendrá la ejecución con exit.

En cambio, cuando sea leído como un archivo INI, el comentario que inicia con ; será ignorado.

Leer un archivo ini o .env con PHP

Por parzibyte Tiempo de lectura: 3 min
1