Las opciones que veo con méritos / debilidades relativas son:
Mecanismos basados en archivos
Estos requieren que su código busque en ubicaciones específicas para encontrar el archivo ini. Este es un problema difícil de resolver y que siempre surge en grandes aplicaciones PHP. Sin embargo, es probable que deba resolver el problema para encontrar el código PHP que se incorpora / reutiliza en tiempo de ejecución.
Los enfoques comunes para esto son siempre usar directorios relativos, o buscar desde el directorio actual hacia arriba para encontrar un archivo nombrado exclusivamente en el directorio base de la aplicación.
Los formatos de archivo comunes que se utilizan para los archivos de configuración son código PHP, archivos con formato ini, JSON, XML, YAML y PHP serializado
Código PHP
Esto proporciona una gran cantidad de flexibilidad para representar diferentes estructuras de datos y (asumiendo que se procesa mediante incluir o requerir) el código analizado estará disponible en la caché de código de operación, lo que brinda un beneficio de rendimiento.
El include_path proporciona un medio para abstraer los lugares potenciales del archivo sin depender de código adicional.
Por otro lado, una de las principales razones para separar la configuración del código es separar las responsabilidades. Proporciona una ruta para inyectar código adicional en el tiempo de ejecución.
Si la configuración se crea a partir de una herramienta, puede ser posible validar los datos en la herramienta, pero no existe una función estándar para escapar de los datos para incrustarlos en el código PHP como existe para HTML, URL, declaraciones MySQL, comandos de shell ... .
Datos serializados
Esto es relativamente eficiente para pequeñas cantidades de configuración (hasta alrededor de 200 elementos) y permite el uso de cualquier estructura de datos PHP. Requiere muy poco código para crear / analizar el archivo de datos (por lo que puede dedicar sus esfuerzos a asegurarse de que el archivo solo se escriba con la autorización adecuada).
El escape del contenido escrito en el archivo se gestiona automáticamente.
Dado que puede serializar objetos, crea una oportunidad para invocar código simplemente leyendo el archivo de configuración (el método mágico __wakeup).
Archivo estructurado
Almacenarlo como un archivo INI como lo sugiere Marcel o JSON o XML también proporciona una API simple para mapear el archivo en una estructura de datos PHP (y con la excepción de XML, para escapar de los datos y crear el archivo) mientras se elimina la invocación del código. vulnerabilidad utilizando datos PHP serializados.
Tendrá características de rendimiento similares a los datos serializados.
Almacenamiento de base de datos
Esto se considera mejor cuando tiene una gran cantidad de configuración pero es selectivo en lo que se necesita para la tarea actual; me sorprendió encontrar que en alrededor de 150 elementos de datos, era más rápido recuperar los datos de una instancia local de MySQL que anular la serialización de un archivo de datos.
¡OTOH no es un buen lugar para almacenar las credenciales que usa para conectarse a su base de datos!
El entorno de ejecución
Puede establecer valores en el entorno de ejecución en el que se ejecuta PHP.
Esto elimina cualquier requisito para que el código PHP busque en un lugar específico para la configuración. OTOH no escala bien a grandes cantidades de datos y es difícil de cambiar universalmente en tiempo de ejecución.
En el cliente
Un lugar que no he mencionado para almacenar datos de configuración es el cliente. Una vez más, la sobrecarga de la red significa que esto no se adapta bien a grandes cantidades de configuración. Y dado que el usuario final tiene control sobre los datos, deben almacenarse en un formato en el que se pueda detectar cualquier manipulación (es decir, con una firma criptográfica) y no debe contener ninguna información que se vea comprometida por su divulgación (es decir, cifrada reversiblemente).
Por el contrario, esto tiene muchos beneficios para almacenar información confidencial que es propiedad del usuario final; si no la almacena en el servidor, no puede ser robada desde allí.
Directorios de red
Otro lugar interesante para almacenar información de configuración es DNS / LDAP. Esto funcionará para una pequeña cantidad de pequeños fragmentos de información, pero no es necesario que se ciña a la primera forma normal; considere, por ejemplo, SPF .
La infraestructura admite el almacenamiento en caché, la replicación y la distribución. Por tanto, funciona bien para infraestructuras muy grandes.
Sistemas de control de versiones
La configuración, como el código, debe administrarse y controlarse la versión; por lo tanto, obtener la configuración directamente desde su sistema de VC es una solución viable. Pero a menudo esto viene con una sobrecarga de rendimiento significativa, por lo que el almacenamiento en caché puede ser aconsejable.