Mejorar el rendimiento de Symfony Cmf Dynamic Routing utilizando la opción de configuración uriFilterRegexp

5 de julio de 2017

He estado trabajando por un tiempo con Symfony Cmf (SfCmf) y he desarrollado algunos sitios con él. Además he creado algunos bundles extras para implementar mis propias ideas sobre SfCmf. El resultado ha sido lo que yo llamo Positibe Project. Positibe Project es un grupo de bundles y librerías que me ayudan a mí y a mi equipo a mejor mi trabajo con este CMF y además poderlo integrar fácilmente con otras librerías como Doctrine ORM, Sylius ResourceBundle, Gedmo Doctrine Extension, Lunetics LocaleBundle entre otras más. Usándolo intentamos crear sistemas webs con sistema de gestión de contenidos de forma sencilla.

Una de nuestras metas es nuestras aplicaciones es el rendimiento, y algunas mejoras al componente Symfony Routing me han hecho pensar en si SfCmf pudiera tener algunos trucos para mejorar su costoso comportamiento. No podemos usar Blackfire por disímiles razones así que hice un chequeo manual a todo el proceso, y encontré una línea donde el Dynamic Router chequea una expresión regular antes de realizar el proceso de comprobación.

¿Entonces que hicimos? Bueno definimos nuestro escenario y este fue el resultado:

1. Usamos tanto el Standard Symfony Router como el SfCmf Dynamic Router con el SfCmf Chain Router. Si el primero no encuentra la ruta el segundo comienza a buscarla.

2. Debemos definir cuál router es el primero en buscar las rutas.

3. Symfony Router es más rápido por lo que usualmente va primero, el problema es que cuando es una ruta de contenido el Symfony Router se ejecuta completo y después es que el SfCmf Dynamic Router comienza su proceso de comprobación.

4. La mayoría de las rutas de nuestra aplicación son dinámicas. 

5. La parte más importante de nuestra aplicación es el frontend donde todas las rutas son dinámicas excepto algunas rutas públicas y de seguridad como el login y el registro.

6. En nuestra aplicación las rutas Symfony están agrupadas por prefijos como /admin, /security, /like /css /js .

7. El patrón de las rutas dinámicas es impredecible.

¿Qué podemos hacer con esa información? Bueno, primero el router más importante para nosotros es el Dynamic Routing así que tiene que ser el primero. Así de simple. Pero nos gustaría evitar su ejecución sobre las rutas symfony y todas ellas poseen un prefijo, por lo que puede usarse este prefijo para excluir el proceso innecesario sobre estas rutas. Nosotros usamos la opción uriFilterRegexp para excluir todas las rutas fijas de la aplicación a través de una expresión regular. Esto significa que el pesado Dynamic Routing es ejecutado primero pero si la ruta no maquea con la expresión la comprobación de rutas continuará con el próximo router. Este proceso no disminuye el rendimiento de esas rutas y si lo incrementa cuando un contenido es solicitado.

La configuración es bien sencilla y viene con SfCmf por defecto. Esta es mi expresión regular usada en el archivo config:

# app/config/config.yml
    # other configs
    cmf_routing:
        chain:
            routers_by_id:
                cmf_routing.dynamic_router: 200
                router.default: 100
        dynamic:
            enabled: true
            uri_filter_regexp: "#^(?!(/css/|/js/|/admin|/security/|/frontend/|/backend/)).*$#"

Espero les sea útil.

Mejorar el rendimiento de Symfony Cmf Dynamic Routing utilizando la opción de configuración uriFilterRegexp

He estado trabajando por un tiempo con Symfony Cmf (SfCmf) y he desarrollado algunos sitios con él. Además he creado algunos bundles extras para imple...


Mejorando la experiencia de desarrollar aplicaciones Symfony con Flex

Después de algún tiempo de espera tras anunciar Flex, ya se encuentra disponible y público lo que será el nuevo juguetito de los desarrolladores Symfo...


IMPRESIONES DEL SEGUNDO ENCUENTRO DE DESARROLLADORES HABANA.

Hace solo algunos días que conozco este grupo de entusiastas y emprendedores que se comunican mediante Google Group bajo el nombre de Desarrolladores...