Datos del Archivo
- Autor/es: Arias
- Fecha de alta: 21-03-2006
- Descargas: 168
Votación
No estás registrado
Descarga

(30,94 KB)
Otras versiones
- Versión 2.0-RC2 18-11-2006
MessageBundle v1
( en 0 votaciones )
Esta clase tiene como proposito ayudar a la i18n (internacionalización) de aplicaciones, problema con el que seguro que muchos os habeis encontrado. Otro posible uso es el de externalizar cosas de una aplicacion, como pueden ser queries a la Base de Datos, enlaces, etc o el de crear archivo de configuración (archivo de propiedades).
Características de esta versión:
Con esta clase sólo tenemos que crear un archivo en el que linea por linea introducimos pares key/value separados por el caracter =, cuando le pidamos a un objeto de la clase el key esta nos devolvera el value.
Un ejemplo de archivo puede ser el siguiente:
saludo = Hola, bienvenido a mi pagina Web!
menu.inicio = Inicio
menu.noticia = Noticias
Para recuperar los valores solo tendriamos que hacer lo siguiente:
[php]
$bundle = MessageBundle::getBundle('español.txt');
echo $bundle->get('saludo'); // Imprime "Hola, bienvenido a mi pagina Web!"
echo $bundle->get('key que no existe'); // Imprime 'key que no existe'
var_dump($bundle->get('key que no existe', false)); // Imprime NULL
[/php]
Por defecto el MessageBundle tiene activado un buffer para recordar claves buscadas previamente y así evitar acceder a disco (siempre es mas lento que acceder a memoria), por mutiples razones puede que no nos interese tener activado este buffer, para ello solo tendríamos que hacer:
[php]
$bundle = MessageBundle::getBundle('english.txt');
$bundle->setBuffer(false);
[/php]
Con ese método podemos activar y desactivar el buffer cuando queramos. Que el buffer este desactivado implica que no se almacenaran nuevas claves en el buffer, sin embargo, si tenemos datos ya almacenadas en el buffer siempre se utilizaran estos en vez de buscarlos de nuevo.
MessageBundle incluye también dos metodos para establecer y recuperar un MessageBundle por defecto. Lo más normal es que creemos un MessageBundle al comienzo de la aplicación y este sea usado a lo largo la misma, guardar una referencia a este objeto a veces puede ser un poco sucio de codigo o engorroso. Para evitar eso podemos usar:
[php]
MessageBundle::setDefault($bundle); // Definimos $bundle como MessageBundle por defecto al comienzo
// ...
$bundle = MessageBundle::getDefault(); // Lo recuperamos mas adelante para su uso
[/php]
Para que la busqueda de los values en el archivo sea eficiente, el MessageBundle necesita crear un archivo auxiliar (crea otro archivo con el mismo nombre añadiendo la extension 'msg') en el que codifica de cierta manera el archivo que le indicamos. Esto es necesario tenerlo en cuenta porque al hacer un MessagBundle::get('archivo.txt') el script creara el archivo "archivo.txt.msg" en caso de este no exista, asi que el archivo que indicamos debe tener permisos de lectura y la carpeta permisos de escritura para poder crear este archivo. Una vez el archivo es creado el script solo lo reconstruye cuando es necesario (cuando no exista el archivo .msg o la fecha de modificacion del archivo original sea mayor que la fecha de modificacion de este).
Existe la posibilidad tambien que el archivo auxiliar no este en la misma carpeta, ni siquiera que tenga ese nombre. Puedes indicar el archivo auxiliar que quieres usar de la siguiente forma:
[php]
$bundle = MessageBundle::getBundle('archivo.txt', 'folder/aux.txt.msg');
[/php]
Limitaciones:
Dado que se usa un numero de bytes fijos para indexar cada cosa dentro del archivo auxiliar aparecen ciertas limitaciones de tamaño, las cuales creo que son más que suficientes.
- El archivo no puede ocupar mas de 4 GB (2 ^ 32)
- La longitud del key no puede ser mayor de 64 KB (2 ^ 16)
- La longitud del value no puede ser mayor de 64 KB (2 ^ 16)
Comentarios (7)
|
#1
Arias 22 mar 06 (10:08) Bueno, ya esta aceptado el archivo asi que espero que dentro de poco realice unos cambios sobre el mismo optimizando aún más las busquedas tratando de evitando agrupamientos primarios de claves a la vez que reduzco un poco el tamaño de la cabecera del archivo auxiliar utilizando una redispersion cuadratica para la colision de claves en vez una redispersion lineal, a la par de que le meto alguna pequeña mejora que ya os comentare en su momento.
Un saludo, Arias. |
|
#2
Arias 22 mar 06 (15:55) Cambios realizados, muchas operaciones fueron optimizadas para conseguir un mayor rendimiento y se cambio el tipo de redispersion de los datos. Tambien se metio alguna cosa mas para que el pesado de Voronwe este contento.
Cualquier cosa decirlo. Un saludo, Arias. |
|
#3
Arias 31 mar 06 (15:15) Bueno, para terminar de optimizar un poquito se cambio el tamaño de la tabla hash para que fuese un numero primario, disminuyendo considerablemente el numero de colisiones (entre un 20 y un 50 por ciento).
|
|
#4
Arias 15 nov 06 (12:34) Dentro de poco os subiré una nueva versión de la clase que estará en PHP5 con algun cambio notorio.
|
|
#5
ninbox 15 nov 06 (17:04) Pues voy a esperar a que saques la nueva version, porque quiza lo integre en el sistema que estoy haciendo.
Aunque si te digo la verdad yo es que habia pensao hacer uno propio, porque me interesa que el archivo de lenguajes tenga una estructura XML, para que pueda ser cargado por PHP, JavaSCript,... en fin que sea independiente del lenguaje, y con este sistema tuyo en algunos como con Javascript me iba ser dificil cargar. No obstante esperando me tienes XD |
|
#6
Arias 16 nov 06 (15:31) Pense en XML, pero haciendolo asi puede pasar que:
1) Si cargas el archivo en memoria entero para que las busquedas sean rapidas estas ocupando muchisima memoria 2) Si no cargas el archivo para ahorrar memoria las busquedas serian muy lentas. Adopte esta estructura porke es la que permite optimizar tanto en memoria como en velocidad. Para la version que voy a subir tambien hare que puedas introducir tu claves y valores manualmente ( con algo como set($clave, $valor) ), de manera que puedes tener tu arhivo xml y en php generar el archivo este raro que usa la clase desde tu xml. Pa principios de la semana que viene os lo mando, que aun hay que ajustar varias cosas 8-) |