Symfony2: Optimización y rendimiento

8,764 views
8,572 views

Published on

Presentación utilizada en las Jornadas de Symfony2 en Vigo, organizadas por GALPON.

Published in: Technology
2 Comments
6 Likes
Statistics
Notes
No Downloads
Views
Total views
8,764
On SlideShare
0
From Embeds
0
Number of Embeds
3,408
Actions
Shares
0
Downloads
147
Comments
2
Likes
6
Embeds 0
No embeds

No notes for slide

Symfony2: Optimización y rendimiento

  1. 1. Optimización y Rendimiento Raúl Fraile Beneyto
  2. 2. ¿Quién soy? Raúl Fraile Beneyto Co-fundador del proyecto Facultia Programador PHP/Symfony Symfony2 “Evangelist”
  3. 4. Are you sure, Fabien? Con cada petición, Symfony: <ul><li>Controlador frontal (app[_dev].php) </li></ul><ul><li>Archivos de configuración </li></ul><ul><li>Bundles </li></ul><ul><li>Rutas </li></ul><ul><li>Controlador interno (action) </li></ul><ul><li>Archivos de traducciones. </li></ul><ul><li>Parsear plantilla/s de Twig. </li></ul><ul><li>Crear la respuesta (html + headers) </li></ul>
  4. 5. Are you sure, Fabien?
  5. 7. ¿Cómo lo consigue? caché 3 + PHP 5.3.2 + Lazy Loading + ESI + APC...
  6. 8. En Symfony se cachea (casi) todo Archivos de configuración Rutas Traducciones Plantillas Twig Clases / Bundles Anotaciones YAML / XML / Annotation / PHP
  7. 10. PHP 5.3
  8. 11. PHP +5.3.2 http://sebastian-bergmann.de/archives/745-Benchmark-of-PHP-Branches-3.0-through-5.3-CVS.html
  9. 12. Lazy loading
  10. 13. Lazy loading Carga de objetos “on demand”, gracias a los “closures”. Si no necesitamos enviar mails, ¿por qué cargar siempre el objeto mailer?
  11. 14. HTTP Cache
  12. 15. 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.
  13. 16. HTTP Cache
  14. 17. HTTP Cache <esi:include src=&quot;http://...&quot; />
  15. 18. HTTP Cache 60' 10' 1'
  16. 19. PHP Accelerator
  17. 20. PHP Accelerator No es obligatorio, aunque sí recomendable, tener instalado un acelerador (Byte Code Cache), como por ejemplo APC. Extensión de PECL
  18. 21. PHP Accelerator Sin APC <ul><li>Lee el archivo prueba.php y lo introduce en memoria. </li></ul><ul><li>El analizador léxico (lexer) lee el código fuente y genera una serie de “tokens”. </li></ul><ul><li>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. </li></ul><ul><li>Se ejecutan los “opcodes”. </li></ul>Ejecutar prueba.php:
  19. 22. PHP Accelerator Con APC <ul><li>La primera vez que se ejecuta, se realizan los mismos pasos que sin APC, aunque se guardan los “opcodes” en la memoria. </li></ul><ul><li>En las siguientes ejecuciones, comprueba si ya se han generado esos “opcodes” para el script prueba.php, y en ese caso los ejecuta directamente. </li></ul>Ejecutar prueba.php:
  20. 23. 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
  21. 24. Twig
  22. 25. 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
  23. 26. Vale, Symfony2 es rápido... … ¿y nosotros?
  24. 27. Backend VS Frontend
  25. 28. 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.
  26. 29. Backend
  27. 30. 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
  28. 31. 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
  29. 32. Optimización: backend Symfony2 Profiler y Toolbar al rescate!
  30. 33. 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.
  31. 34. Optimización: backend Operaciones complejas / bloqueantes Eliminar el sincronismo: tareas automáticas o sistemas de cola de mensajes (RabbitMQ). http://vimeo.com/26150500
  32. 35. 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).
  33. 36. Frontend
  34. 37. 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.
  35. 39. Optimización: frontend Problemas más comunes Imágenes muy pesadas. Múltiples archivos CSS/JS sin “minificar”. Demasiadas conexiones. “ Cache headers” mal configuradas.
  36. 40. 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/
  37. 41. 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.
  38. 42. 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>”.
  39. 45. 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
  40. 46. 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.
  41. 47. 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=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot; {{ asset_url }} &quot; /> {% endstylesheets %}
  42. 48. ¡Gracias! E-mail: [email_address] Twitter: @raulfraile Github: raulfraile http://www.slideshare.net/raulfraile ¿Preguntas o nos vamos a comer?

×