2012-03-25 15 views
8

Al igual que in this topic, tengo un problema de rendimiento en el modo dev cuando agrego una etiqueta twig "render" en mi aplicación (documentación relacionada: Embedding controllers).Symfony2 y Twig rinden problemas de rendimiento

Sin esta etiqueta de renderizado, mis páginas se generan en menos de 70 ms. Con la etiqueta de renderizado, es de al menos 170 ms. Y cada etiqueta de renderizado agregada en la aplicación aumenta la generación de la página en 100 ms (que es MUCHO: ¿por qué una página normal se ejecuta en 60 ms y una etiqueta de renderizado en 100 ms?). Es posible que necesite 4 o 5 de ellos en cada página de mi aplicación, por lo que significaría al menos 500 ms para cada página en modo dev.

Entiendo totalmente que no hay ningún problema en el modo prod, pero claramente no es cómodo en el desarrollo. Entonces, ¿alguien sabe alguna forma de deshacerse de llamadas inútiles, registros o códigos mientras usa la etiqueta "render" en el modo dev?

Respuesta

8

Tengo explained hace solo 10 horas. Para resumir, migre a las extensiones de Twig.

+2

Bueno, en este caso, la creación de un servicio para la lógica del controlador es mejor en mi humilde opinión. Si la lógica del controlador tiene operación de DB, entonces creo que es mejor no mover la lógica a la función de ramitas. La creación de un servicio separado también garantiza la resutilización si el controlador incrustado tiene una ruta adjunta y se puede llamar de forma independiente. –

+0

Nada le impide llamar a servicios desde una extensión Twig. De hecho, eso es lo que hago. No es un problema como este VS. Las extensiones de My Twig solo llaman acciones de controladores definidas como servicios. Esas acciones son reutilizables sin extensiones de Twig. –

+1

Bueno, el servicio también puede exponerse a ramitas agregando la variable global twig en 'app/config.yml'. Simplemente una forma diferente de lograr cosas. Nada de qué discutir en realidad :). –

6

Puede mover la lógica de su controlador a un servicio y hacer referencia a ella como variable global twig y luego incluir la plantilla presentada por el controlador.

Consulte https://stackoverflow.com/a/13245994/982075 para obtener instrucciones.

8

Una de mis funciones favoritas en Symfony es la etiqueta de renderizado, que integra llamadas de controlador. Sin embargo, el generador de perfiles agrega mucha sobrecarga a todas las llamadas de controlador, no solo a la velocidad sino que usa mucha memoria. Tienes algunas opciones para acelerarlo.

El generador de perfiles escribe todos los datos en una base de datos sqlite de forma predeterminada. IIRC sqlite no permite insertos paralelos, por lo que cada solicitud debe esperar su turno para acceder a la base de datos para vaciar los recopiladores de datos. Puede usar su db de desarrollo (mysql o lo que sea que use) para conservar los datos del perfilador. Hace un año gané mucho con esto en términos de velocidad.

También puede desactivar el generador de perfiles para solicitudes secundarias, o solo usar el generador de perfiles cuando ocurre una excepción. Vea the framework config reference para los detalles completos.

# config_dev.yaml 
framework: 
    profiler: 
     only_exceptions:  false 
     only_master_requests: false 
     dsn:     sqlite:%kernel.cache_dir%/profiler.db 
+0

Tuve el prbl usando render_esi(); en este caso, la solución @ m2mdas no es factible. – lrkwz

+0

Eso es un truco interesante seguro :-) – MauganRa

2

La elección depende de su aplicación. Creo que las formas más prácticas son:

1) Use la etiqueta render para plantillas pesadas y use la biblioteca hinclude para cargarlas de forma asíncrona. Esto es muy útil cuando cada plantilla que se va a renderizar es "lenta" por sí misma (por ejemplo, muchas conexiones de base de datos, textos grandes, etc.).

2) Realice lo propuesto por m2mdas. Esta es una solución muy rápida para casos comunes.

Cuestiones relacionadas