Symfony2: Optimización y rendimiento

  • 7,593 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
7,593
On Slideshare
0
From Embeds
0
Number of Embeds
6

Actions

Shares
Downloads
129
Comments
2
Likes
5

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Optimización y Rendimiento Raúl Fraile Beneyto
  • 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:
    • 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)
  • 5. Are you sure, Fabien?
  • 6.  
  • 7. ¿Cómo lo consigue? caché 3 + PHP 5.3.2 + Lazy Loading + ESI + APC...
  • 8. En Symfony se cachea (casi) todo Archivos de configuración Rutas Traducciones Plantillas Twig Clases / Bundles Anotaciones YAML / XML / Annotation / PHP
  • 9.  
  • 10. PHP 5.3
  • 11. PHP +5.3.2 http://sebastian-bergmann.de/archives/745-Benchmark-of-PHP-Branches-3.0-through-5.3-CVS.html
  • 12. Lazy loading
  • 13. Lazy loading Carga de objetos “on demand”, gracias a los “closures”. Si no necesitamos enviar mails, ¿por qué cargar siempre el objeto mailer?
  • 14. HTTP Cache
  • 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.
  • 16. HTTP Cache
  • 17. HTTP Cache <esi:include src=&quot;http://...&quot; />
  • 18. HTTP Cache 60' 10' 1'
  • 19. PHP Accelerator
  • 20. PHP Accelerator No es obligatorio, aunque sí recomendable, tener instalado un acelerador (Byte Code Cache), como por ejemplo APC. Extensión de PECL
  • 21. PHP Accelerator Sin APC
    • Lee el archivo prueba.php y lo introduce en memoria.
    • El analizador léxico (lexer) lee el código fuente y genera una serie de “tokens”.
    • 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.
    • Se ejecutan los “opcodes”.
    Ejecutar prueba.php:
  • 22. PHP Accelerator Con APC
    • La primera vez que se ejecuta, se realizan los mismos pasos que sin APC, aunque se guardan los “opcodes” en la memoria.
    • 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:
  • 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
  • 24. Twig
  • 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
  • 26. Vale, Symfony2 es rápido... … ¿y nosotros?
  • 27. Backend VS Frontend
  • 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.
  • 29. Backend
  • 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
  • 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
  • 32. Optimización: backend Symfony2 Profiler y Toolbar al rescate!
  • 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.
  • 34. Optimización: backend Operaciones complejas / bloqueantes Eliminar el sincronismo: tareas automáticas o sistemas de cola de mensajes (RabbitMQ). http://vimeo.com/26150500
  • 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).
  • 36. Frontend
  • 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.
  • 38.  
  • 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.
  • 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/
  • 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.
  • 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>”.
  • 43.  
  • 44.  
  • 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
  • 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.
  • 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 %}
  • 48. ¡Gracias! E-mail: [email_address] Twitter: @raulfraile Github: raulfraile http://www.slideshare.net/raulfraile ¿Preguntas o nos vamos a comer?