php

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.