symfony2: optimización y rendimiento
DESCRIPTION
Presentación utilizada en las Jornadas de Symfony2 en Vigo, organizadas por GALPON.TRANSCRIPT
![Page 1: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/1.jpg)
Optimización y RendimientoRaúl Fraile Beneyto
![Page 2: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/2.jpg)
¿Quién soy?
Raúl Fraile Beneyto
Co-fundador del proyecto Facultia
Programador PHP/Symfony
Symfony2 “Evangelist”
![Page 3: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/3.jpg)
![Page 4: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/4.jpg)
Are you sure, Fabien?
Con cada petición, Symfony:
Controlador frontal (app[_dev].php) Archivos de configuración Bundles Rutas
Controlador interno (action) Archivos de traducciones. Parsear plantilla/s de Twig. Crear la respuesta (html + headers)
![Page 5: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/5.jpg)
Are you sure, Fabien?
![Page 6: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/6.jpg)
![Page 7: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/7.jpg)
¿Cómo lo consigue?
caché3
+ PHP 5.3.2 + Lazy Loading + ESI + APC...
![Page 8: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/8.jpg)
En Symfony se cachea (casi) todo
Archivos deconfiguración
Rutas
Traducciones
PlantillasTwig
Clases /Bundles
Anotaciones
YAML / XML / Annotation / PHP
![Page 9: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/9.jpg)
![Page 10: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/10.jpg)
PHP 5.3
![Page 11: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/11.jpg)
PHP +5.3.2
http://sebastian-bergmann.de/archives/745-Benchmark-of-PHP-Branches-3.0-through-5.3-CVS.html
![Page 12: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/12.jpg)
Lazy loading
![Page 13: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/13.jpg)
Lazy loading
Carga de objetos “on demand”, gracias a los “closures”.
Si no necesitamos enviar mails, ¿por qué cargar siempre el objeto mailer?
![Page 14: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/14.jpg)
HTTPCache
![Page 15: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/15.jpg)
HTTP Cache
Especificación HTTP/1.1 y el uso de ESI (Edge Side Includes), que permite cachear “trozos”
de una misma página en tiempos distintos.
Es necesario disponer de un proxy caché (p.ej. Varnish o Squid). Symfony lleva uno integrado
programado en PHP.
![Page 16: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/16.jpg)
HTTP Cache
![Page 17: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/17.jpg)
HTTP Cache
<esi:include src="http://..." />
![Page 18: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/18.jpg)
HTTP Cache
60' 10'
1'
![Page 19: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/19.jpg)
PHP Accelerator
![Page 20: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/20.jpg)
PHP Accelerator
No es obligatorio, aunque sí recomendable, tener instalado un acelerador (Byte Code Cache),
como por ejemplo APC.
Extensión de PECL
![Page 21: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/21.jpg)
PHP Accelerator
Sin APC
1) Lee el archivo prueba.php y lo introduce en memoria.
2) El analizador léxico (lexer) lee el código fuente y genera una serie de “tokens”.
3) El analizador sintáctico (parser) parsea los tokens y se genera una serie de “opcodes”, que puede ser ejecutado directamente por el motor de PHP.
4) Se ejecutan los “opcodes”.
Ejecutar prueba.php:
![Page 22: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/22.jpg)
PHP Accelerator
Con APC
1) La primera vez que se ejecuta, se realizan los mismos pasos que sin APC, aunque se guardan los “opcodes” en la memoria.
2) En las siguientes ejecuciones, comprueba si ya se han generado esos “opcodes” para el script prueba.php, y en ese caso los ejecuta directamente.
Ejecutar prueba.php:
![Page 23: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/23.jpg)
PHP Accelerator
Problema: APC necesita comprobar si el código ha cambiado para volver a compilar.
Máximo rendimiento: apc.stat=0 en el php.ini
![Page 24: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/24.jpg)
Twig
![Page 25: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/25.jpg)
Twig
Twig Extension
Los benchmarks mostraban que el método TwigTemplate::getAttribute() era uno de los más lentos
de Twig y con PHP era dificil optimizarlo más.
Se le pidió a Derick Rethans (creador de Xdebug) si podía crear una extensión en C para mejorar el rendimiento.
Se prevee que Twig 1.4 la incluya.
https://github.com/derickr/twig-ext
![Page 26: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/26.jpg)
Vale, Symfony2 es rápido...
… ¿y nosotros?
![Page 27: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/27.jpg)
Backend VS Frontend
![Page 28: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/28.jpg)
Optimización: objetivos
Backend
Generar la página HTML en el menor tiempo posible.
Frontend
Que el navegador reciba la página la menor cantidad de datos en el mínimo tiempo.
![Page 29: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/29.jpg)
Backend
![Page 30: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/30.jpg)
Optimización: backend
Problemas más comunes
Consultas lentas a base de datos
Bloquear al usuario con operaciones complejas: llamadas a APIs, envío de emails, procesado de
imágenes...
Operaciones de I/O
“Copia descontrolada” de variables/objetos
![Page 31: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/31.jpg)
Optimización: backend
Symfony2 Profiler y Toolbar al rescate!
Versión de Symfony
Versión de PHP
Xdebug
PHP Accelerator
Entorno de ejecución
Acceso al profiler
Controlador::acción|ruta|código HTTP
Logs
Tiempo y tamaño de la página
Consultas a BD
![Page 32: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/32.jpg)
Optimización: backend
Symfony2 Profiler y Toolbar al rescate!
![Page 33: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/33.jpg)
Optimización: backend
Base de datos (MySQL)
Activar (con precaución) el log de consultas lentas.
Cachear resultados con Memcache o Redis.
Cuidado con las búsquedas fulltext, utilizar Sphinx.
“EXPLAIN” es tu amigo.
![Page 34: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/34.jpg)
Optimización: backend
Operaciones complejas / bloqueantes
Eliminar el sincronismo: tareas automáticas o sistemas de cola de mensajes (RabbitMQ).
http://vimeo.com/26150500
![Page 35: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/35.jpg)
Optimización: backend
Mejoras en Symfony
Volcar todas las rutas en un .htaccess (app/console --env=prod router:dump)
Autoload con ApcUniversalClassLoader (en vez de con UniversalClassLoader).
![Page 36: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/36.jpg)
Frontend
![Page 37: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/37.jpg)
Optimización: frontend
Todavía hay mucha gente que navega “lento”
ADSL en zonas rurales
Conexiones móviles (teléfonos o modems 3G)
Redes saturadas
Debemos ayudar a estos usuarios y mejorar la experiencia de los restantes.
![Page 38: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/38.jpg)
![Page 39: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/39.jpg)
Optimización: frontend
Problemas más comunes
Imágenes muy pesadas.
Múltiples archivos CSS/JS sin “minificar”.
Demasiadas conexiones.
“Cache headers” mal configuradas.
![Page 40: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/40.jpg)
Optimización: frontend
Herramientas indispensables
YSlow PageSpeed
http://addons.mozilla.org/en-US/firefox/addon/yslow/ http://code.google.com/intl/en/speed/page-speed/
![Page 41: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/41.jpg)
Optimización: frontend
Imágenes
Programas para optimizar imágenes, algunos de ellos “lossless”: pngcrush (PNG), optiPNG
(PNG), jpegtran (JPG) e ImageMagick (todos).
Evitar los GIF, normalmente serán más adecuados los PNG.
Combina imágenes para realizar menos peticiones.
Optimizar favicon, por debajo de 1Kb.
![Page 42: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/42.jpg)
Optimización: frontend
Archivos CSS/JS
Combinar varios CSS en un único archivo (igual para los JS).
“Minificar” los CSS/JS para eliminar comentarios, espacios en blanco, etc.
Intentar cargar los CSS en el “<head>” y los JS justo antes del “</body>”.
![Page 43: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/43.jpg)
![Page 44: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/44.jpg)
![Page 45: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/45.jpg)
Optimización: frontend
Assetic
Assetic es un gestor de “assets” para PHP 5.3.
Con sus filtros permite optimizar imágenes, combinar CSS, minificarlos, utilizar
preprocesadores CSS (p.ej. LESS)... sin salir de PHP!
Viene incluido como bundle en Symfony
![Page 46: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/46.jpg)
Optimización: frontend
Assetic: filtros
Coffee Script: lenguaje más simple que JS.
LESS: mejora CSS con variables, funciones...
Google Closure Compiler: optimiza código JS.
JSMin: minify de código JS.
YUI Compressor: minify de JS y CSS.
OptiPNG: optimización de imágenes PNG.
![Page 47: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/47.jpg)
Optimización: frontend
Assetic: ejemplo
{% stylesheets '@FacultiaBundle/Resources/public/css/bootstrap.css' '@FacultiaBundle/Resources/public/css/styles.css' output = 'css/fstyles.css' filter='?yui_css'%} <link rel="stylesheet" type="text/css" href="{{ asset_url }}" />{% endstylesheets %}
![Page 48: Symfony2: Optimización y rendimiento](https://reader033.vdocuments.site/reader033/viewer/2022061214/549a42a6ac795959288b5c22/html5/thumbnails/48.jpg)
¡Gracias!
E-mail: [email protected]
Twitter: @raulfraile
Github: raulfraile
http://www.slideshare.net/raulfraile
¿Preguntas o nosvamos a comer?