Inicio

Pensamientos

Ver entrada

Avatar de jesus   jesus   07/03/2011 a las 07:03
Menú por Ajax y cacheo en web
Foto: Menú por Ajax y cacheo en web Sigo haciendo algunos cambios sustanciales en la web.

Una de las cosas que esta web no necesita pero que he incluído, y que está bien que se incluya, es un menú, el nombre del usuario y el número de correos sin leer (en el caso de que esté registrado).

Esta información se generaba antes de enviar el HTML al navegador, preguntando a un objeto de sesión que tengo programado, quién es el usuario y qué menú se le tiene que mostrar (dependiendo del rol del usuario se le muestran unas u otras opciones). O sea, de manera bastante típica.

Esto está bien, pero está mejor aún hacerlo por Ajax (Asynchronous JavaScript And XML). ¿Por qué? Pues veamos el motivo.

Estoy usando un framework MVC que desarrollé (y sigo mejorando) en PHP y que permite, entre otras funcionalidades, cachear la respuesta que se envía al navegador. O sea, alguien hace una petición tal como "www.desastrecajon.es" y se envía, durante un periodo de tiempo que se puede establecer o que puede ser por defecto, la misma respuesta HTML a todo el mundo.

¿Qué ventajas tiene esto? Básicamente que todos los cálculos que hubiera que hacer, los bucles de control de PHP, y los accesos a base de datos, se reducen a cero. Esto supone una diferencia de milésimas de segundo de respuesta, al menos para la mayoría de los casos, pero para páginas complicadas con muchas peticiones a base de datos, o cuando hay problemas con los servidores, supone que ciertos cuellos de botella no nos afectan.

Pero ahora surje un problema: ¿qué es lo que pasa con aquel contenido que se genera individualmente y personalizado en cada petición? Por ejemplo, ¿qué pasa con el menú y con la información personal del usuario? ¿también se cachean?

Pues sí, también se cachean esas cosas. Pero lo que hay que hacer entonces es no incluír dicho contenido en la respuesta HTML, y sustituírlo por peticiones asíncronas que rellenen las etiquetas HTML con la información personalizada.

En el caso del menú, lo que he hecho es algo relativamente sencillo. He escrito un plugin (clon del plugin de Zend), que no es más que algo que se va a ejecutar siempre que se lance un evento (en este caso, un evento podríamos llamar... "generar HTML"), que cuando se va a generar una respuesta HTML incluye en las cabeceras HTML (no HTTP, por Dios) un enlace a un archivo js, el cual a su vez, una vez cargado el documento en el navegador del cliente, hará una petición a un controlador y una acción del framework, que se encargará de evaluar qué menú pintar para el usuario. Se devuelve el menú (por no complicarme, en formato texto, aunque podría ser un json a parsear), y el mismo js incrusta el resultado en el DIV correspondiente. En realidad no era necesario hacer dicho plugin, pero me evita ir "página por página" metiendo la referencia al script js, ya que se hace de forma automatizada.

Aquí hay varias consecuencias a evaluar: estamos generando más peticiones HTTP, pero al mismo tiempo, éstas son procesadas más rápidamente e individualmente son más ligeras (por lo que la página comienza a mostrar contenido unas milésimas de segundo antes... aunque a veces estas milésimas de segundo son segundos).

Pero la principal ventaja de esta manera de programar es que ahora ya podría hacer uso del sistema de cacheo de mi framework MVC. Y digo podría, porque en la práctica el componente que gestiona el cacheo de peticiones y respuestas HTML hace uso de un componente PHP llamado APC (Alternative PHP Cache), y dicho componente por ahora no lo tengo instalado en el servidor.

APC es interesante por dos motivos: una vez analizado y pasado a código ejecutable el código fuente, este último se almacena y es ejecutado directamente cada vez que vaya a ser usado en posteriores ocasiones. Esto supone una mejora "considerable" en el uso de los recursos y los tiempos de respuesta. Pero además, APC permite a PHP lo nunca visto antes: almacenar en memoria dinámica variables de manera persistente.

Y precisamente es haciendo uso de esta última característica cómo gestiono la existencia o no, y la validez, de las páginas cacheadas: almacenando durante un tiempo determinado la información de una página generada y cacheada.

Pero como no tengo dicho componente instalado, no puedo disfrutar de las evidentes ventajas de tener cacheado tanto el código de la aplicación como la portada de la web, que evidentemente era la página que más merece la pena cachear.

Está claro que podría serializar dicha información en disco, pero entonces incrementarían los tiempos de acceso a disco, y ya no me interesa tanto como cuando está en memoria RAM. Aún así, habría que darle una oportunidad...

¿Por qué APC no es un componente que incluya el hosting, si redunda en menos carga de trabajo para el procesador del servidor? Pues porque incrementa de manera variable el uso de la memoria RAM del mismo para almacenar el código ejecutable cacheado, y porque además APC permite al programador almacenar variables... y seguir incrementando el uso de RAM. Y esto... no es algo que les interese.

Por lo demás, hay algún que otro cambio que merece la pena mencionar. Por un lado, los estilos de la página están cambiando, poco a poco, pero cambiando para mejor, y por otro lado, descubrí otro punto débil del alojamiento web de este portal: "mi" servidor Apache no devuelve por defecto las respuestas comprimidas con gzip o deflate, sino que las manda tal cual. Esto es un poco extraño, así que activé algo que tenía olvidado en mi framework, y que hace lo propio en estos casos: enviar la página usando GZip. Se nota la diferencia en peso, en concreto, el HTML está comprimido al 75%. ¡No está nada mal! Yo que por ahora tengo la conexión de mi vecino, que me va muy mal, veo reducidos los tiempos de carga de manera radical :)

Y poco más. Espero que haya por ahí algún friki informático que le saque jugo a todo esto...

Visto: 179 veces   Compartir en Menéame Compartir en Twitter Compartir en Facebook Compartir en Delicious

Imágenes relacionadas:

Ese soy yo Pablito y Sophia Retrato de Sophia con Minolta XD-5 III Niñas marroquinas Colores de Essaouira Ese soy yo Yo en el fuerte español en Keelung Pescadores y gaviotas en Essaouira Barca en Essaouira Pato y Photoshop  Temperatura de color Torres de alta tensión III

Aviso Legal Contacto Mapa del sitio Colabora Buscador Acerca de esta web Acerca del autor
DeSastreCajón, corriendo sobre jMVC