2010-01-06 9 views
23

¿Cuál es la forma más rápida de almacenar datos de configuración en PHP para que sea fácilmente modificable (a través de PHP)? Primero pensé en tener el archivo config.php, pero no puedo editarlo al vuelo con PHP, al menos no de forma muy simple. Luego pensé en tener archivos XML, pero analizarlos para cada solicitud HTTP es abrumador. Entonces, pensé en los archivos INI, pero luego pensé que los archivos INI están restringidos a los valores int/string. Al final, he llegado a la conclusión de que el archivo codificado JSON es el mejor:¿La forma más rápida de almacenar datos de configuración fácilmente editables en PHP?

$config['database']['host'] = ...; 
$config['another']['something'] = ...; 
... 
json_encode($config); 

Desde JSON puede almacenar matrices, puedo crear configuraciones muy complejas con ella, y analiza más rápido que los archivos INI.

Mi pregunta: ¿extrañé algo o hay una mejor manera de hacerlo?

Respuesta

35

Serializar es una mejor opción que JSON para almacenar variables de PHP.

Me gusta usar var_export para guardar el archivo de configuración y usar include para cargar información de configuración. Esto hace que sea fácil de guardar los datos de configuración progmatically Y hace que los datos de fácil lectura/escritura para una persona, así:

config.php:

return array(
'var1'=> 'value1', 
'var2'=> 'value2', 
); 

prueba.php:

$config = include 'config.php'; 
$config['var2']= 'value3'; 
file_put_contents('config.php', '<?php return ' . var_export($config, true) . ';'); 

config.php actualizada ahora contiene lo siguiente:

return array(
'var1'=> 'value1', 
'var2'=> 'value3', 
); 
+0

¿Por qué no simplemente 'file_put_contents ('config.php', '$ config ='. Var_export ($ config));'? –

+2

Eso funcionaría - de cualquier manera encontrando la forma de convertirlo en una variable global. – leepowers

+2

¡Oh, cómo podría haber olvidado var_export()! – Tower

2

Debe utilizar serialize en contraposición a json_encode:

http://docs.php.net/serialize

+3

+1 por ser la forma más rápida, pero las cadenas PHP serializadas no son fáciles de ver. Confío en algo como JSON o investigo usando YAML si estás tratando de hacer algo que sea más fácil de usar que las cadenas serializadas de PHP. –

+1

Sé serializar(), pero no sé ninguna razón para usarlo sobre json_encode(). Es mejor para los objetos, pero eso no es necesario para los datos de configuración. JSON también es más rápido. – Tower

+0

@Tower - JSON está diseñado principalmente para trabajar con javascript (JavaScript Object Notation) y las funciones json requieren que se haya instalado la extensión PHP JSON. serialize es parte del núcleo de PHP y siempre estará disponible. He comparado los dos y en algunas pruebas json es más rápido y en otros serializar es más rápido. De cualquier manera, la diferencia es insignificante. Si desea que el archivo de configuración sea editable por PHP y manualmente, elija JSON u otro formato; de lo contrario, debe usar la función de serialización nativa – Inspire

2

A mi modo de almacén de configuración es poner algunas variables en un archivo .php externo y luego cuando quiero usar esos archivos, digo :

<?php include("fileName"); ?>

Y eso permitirá compartir información de configuración a través de muchas páginas. Sin embargo, no estoy seguro de que este sea el método más eficiente, pero me pareció el más fácil.

+7

Consejo: si hace que el archivo de configuración 'return' sea su matriz, puede cargar los valores de esta manera:' $ config = include ('filename'); '. – Geert

+0

Hola, gracias, nunca pensé en eso. – zmbush

+0

Me gusta Kohana 3 config Geert? – rick

0

Estoy bastante seguro de que está en lo cierto acerca de los valores int/cuerda y sí JSON es un camino, pero serializar y revertir la seriación una cadena será más rápido para la optimización de la velocidad:

Este enlace le ayudará a:

http://docs.php.net/serialize

+1

¿Qué te hace decir que serializar es más rápido? Hice algunas pruebas, y descubrí que JSON es aproximadamente un 20% más rápido que serialize(). – Tower

2

Si bien lo más probable es excesivo para lo que yo estás después, pero lo que tiendo a hacer es almacenar los datos de configuración en una base de datos utilizando una clase PHP para controlar los cambios en los pares de nombre/valor dentro. (es decir: no hay acceso DB directo desde fuera de esta clase.)

Cuando se realiza una llamada a la clase de configuración de PHP para cambiar un valor, este escribe un archivo de inclusión PHP con todos los valores definidos en él .

Como tal, no hay rendimiento de tiempo de carga al leer los datos de configuración y todos los datos de configuración se pueden cambiar dentro de la base de datos a través de un módulo CMS.

+0

Estos datos de configuración deben cargarse antes de cualquier conexión a la base de datos. Una de las razones es que sin datos de configuración, la aplicación no sabe cómo conectarse a la base de datos. – Tower

+0

@Tower - Lea lo que dije: los datos de configuración se escriben en un archivo de inclusión de PHP estándar. (La base de datos solo se usa para almacenar los valores "maestros" de los que se genera el archivo de inclusión). Si desea almacenar la información de configuración de la base de datos allí, deberá arrancarla de alguna manera. –

0

Utilizo una base de datos con una tabla llamada configuración o configuraciones. La tabla tiene dos columnas:

name [varchar(255)] 
value [varchar(255)] 

Esto permite el fácil almacenamiento de int, float y cuerdas cortas.

Luego creo dos funciones, GetSetting y SetSetting. Estos almacenan una fila y recuperan una fila, respectivamente. Encuentro que esto simplifica tremendamente el almacenamiento de valores.

+1

Estos datos de configuración se deben cargar antes de cualquier conexión a la base de datos. Una de las razones es que sin datos de configuración, la aplicación no sabe cómo conectarse a la base de datos. – Tower

+0

Es lo mismo en mi caso. Solo guardo la configuración de la base de datos en algo como dbconfig.php con $ user = 'username', $ pass = 'password', y así sucesivamente. De esta manera, solo estoy almacenando lo suficiente para conectarme a la base de datos y el resto está en la base de datos. –

0

Si utiliza require en lugar de include para el archivo de configuración obtendrá un poco de rendimiento. Puede hacer esto si sabe que el archivo de configuración siempre estará en su lugar, o cuando tiene su propio mecanismo para verificar si existe.

Cuestiones relacionadas