Symfony2: Optimización y rendimiento
-
Upload
raul-fraile -
Category
Technology
-
view
7.612 -
download
3
description
Transcript of Symfony2: Optimización y rendimiento
Optimización y RendimientoRaúl Fraile Beneyto
¿Quién soy?
Raúl Fraile Beneyto
Co-fundador del proyecto Facultia
Programador PHP/Symfony
Symfony2 “Evangelist”
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)
Are you sure, Fabien?
¿Cómo lo consigue?
caché3
+ PHP 5.3.2 + Lazy Loading + ESI + APC...
En Symfony se cachea (casi) todo
Archivos deconfiguración
Rutas
Traducciones
PlantillasTwig
Clases /Bundles
Anotaciones
YAML / XML / Annotation / PHP
PHP 5.3
PHP +5.3.2
http://sebastian-bergmann.de/archives/745-Benchmark-of-PHP-Branches-3.0-through-5.3-CVS.html
Lazy loading
Lazy loading
Carga de objetos “on demand”, gracias a los “closures”.
Si no necesitamos enviar mails, ¿por qué cargar siempre el objeto mailer?
HTTPCache
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.
HTTP Cache
HTTP Cache
<esi:include src="http://..." />
HTTP Cache
60' 10'
1'
PHP Accelerator
PHP Accelerator
No es obligatorio, aunque sí recomendable, tener instalado un acelerador (Byte Code Cache),
como por ejemplo APC.
Extensión de PECL
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:
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:
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
Twig
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
Vale, Symfony2 es rápido...
… ¿y nosotros?
Backend VS Frontend
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.
Backend
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
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
Optimización: backend
Symfony2 Profiler y Toolbar al rescate!
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.
Optimización: backend
Operaciones complejas / bloqueantes
Eliminar el sincronismo: tareas automáticas o sistemas de cola de mensajes (RabbitMQ).
http://vimeo.com/26150500
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).
Frontend
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.
Optimización: frontend
Problemas más comunes
Imágenes muy pesadas.
Múltiples archivos CSS/JS sin “minificar”.
Demasiadas conexiones.
“Cache headers” mal configuradas.
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/
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.
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>”.
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
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.
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 %}
¡Gracias!
E-mail: [email protected]
Twitter: @raulfraile
Github: raulfraile
http://www.slideshare.net/raulfraile
¿Preguntas o nosvamos a comer?