Introducción:**

En lo que llevamos de mes, Guillermo Torres @guitobon me ha estado ayudando a optimizar el rendimiento de kawagames.com, consiguiendo un resultado formidable en un par de semanas. Pasando de rating B/C a rating A/A en page speed y yslow. Desde aquí quería agradecer públicamente a Guillermo por su ayuda y recomendaros su formidable trabajo :)

Gtmetrix:

Rendimiento del 11 de enero de 2012:

Rendimiento del 28 de diciembre de 2011:

Filtrado de URLs como una de las claves para la facilidad de optimización:

Al margen de estos estupendos resultados, quería comentar cual ha sido una de las claves más importantes para conseguir este estupendo resultado: y ese ha sido el filtrado de urls.

¿En qué consiste en filtrar las URLs?
Consiste en que cada url que se saca en la web pasa por una función que permite procesarla y devolver la url procesada. Todas las urls de kawagames.com pasan por una función filtro que se encarga de reescribir la URL y en algunos casos de hacer alguna operación más.

¿Cómo hago yo ese filtro?
En el caso de kawagames, utilizo Twig como sistema de templates. Un sistema de templates tipo Django para PHP de Sension Labs. Con su herencia de templates y modelado por bloques consigo hacer cosas muy interesantes con una facilidad pasmosa y como los templates se compilan en código PHP el rendimiento es muy bueno.

Filtro normalize_url:

Login

Twig permite la definición de filtros personalizados. Así que absolutamente todas las urls que muestro en el html en kawagames, pasan por la función de normalizado de urls.

¿En qué ayuda el filtro?

Hasta diciembre, todas las urls generadas estaban en los dominios de *.kawagames.com.

Redirección al dominio correcto:
Hasta aquel momento usaba el filtro de urls para poder saber qué urls iban por HTTPS y HTTP, reescribiendo las urls para que apuntasen al lugar correcto.
A partir de enero también para enlazar a la misma página en diferentes idiomas:

{% for lang in [‘es’, ‘en’, ‘ja’, ‘cn’] %}{% if locale.lang != lang %}

{% endif %}{% endfor %}

**Compilación y minificación on-demand de CSS y JS:**

También usaba la reescritura de URLs para saber cuando se iba a necesitar un determinado CSS o Javascript. Para comprobar si ya lo tenía generado en APC o mirar en el sistema de archivos. En la generación, junto varios CSS o JS que tengo en diferentes archivos y les paso el yuicompressor. Luego genero un archivo .gz por cada css o js minificado de forma que nginx puede servirlo directamente sin proceso adicional y si nnecesidad de ningún plugin mod_speed para servidor.
En los CSS también aprovecho para gestionar todos los url(‘…’) y procesar las urls.

Redirección de estáticos a dominio libre de cookies:

Como *.kawagames.com tienen cookies para permitir navegar entre los diferentes idiomas y la versión https, necesitaba un dominio libre de cookies para optimización de contenido. El hecho de tener la el filtro de URLs, hizo que pasarlo a un dominio libre de cookies fuese añadir un par de líneas de código :)
if (url empieza por /static) return ‘dominio de estáticos ‘ . $uri;

Conclusión:

Tener una función por donde pasen todas las urls de una forma centralizada, es no solo una buena idea, sino necesario en proyectos grandes. Desde poder generar contenido, hasta estadística, verificación o reescritura de urls para poder mover o balancear el contenido.

¡Por ahora eso es todo! Comentaré más cosas interesantes sobre la arquitectura de Kawagames en otro post.

Saludos.