Optimización y Rendimiento Raú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 de configuración Rutas Traducciones Plantillas Twig 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?
HTTP Cache
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=&quot;http://...&quot; />
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 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:
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:
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=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot; {{ asset_url }} &quot; /> {%   endstylesheets   %}
¡Gracias! E-mail:  [email_address] Twitter: @raulfraile Github: raulfraile http://www.slideshare.net/raulfraile ¿Preguntas o nos vamos a comer?

Symfony2: Optimización y rendimiento

  • 1.
    Optimización y RendimientoRaúl Fraile Beneyto
  • 2.
    ¿Quién soy? RaúlFraile 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.
  • 6.
  • 7.
    ¿Cómo lo consigue?caché 3 + PHP 5.3.2 + Lazy Loading + ESI + APC...
  • 8.
    En Symfony secachea (casi) todo Archivos de configuración Rutas Traducciones Plantillas Twig Clases / Bundles Anotaciones YAML / XML / Annotation / PHP
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
    Lazy loading Cargade objetos “on demand”, gracias a los “closures”. Si no necesitamos enviar mails, ¿por qué cargar siempre el objeto mailer?
  • 14.
  • 15.
    HTTP Cache EspecificaciónHTTP/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.
  • 17.
    HTTP Cache <esi:includesrc=&quot;http://...&quot; />
  • 18.
  • 19.
  • 20.
    PHP Accelerator Noes obligatorio, aunque sí recomendable, tener instalado un acelerador (Byte Code Cache), como por ejemplo APC. Extensión de PECL
  • 21.
    PHP Accelerator SinAPC 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 ConAPC 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.
  • 25.
    Twig Twig ExtensionLos 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 esrápido... … ¿y nosotros?
  • 27.
    Backend VS Frontend
  • 28.
    Optimización: objetivos BackendGenerar 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.
  • 30.
    Optimización: backend Problemasmá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 Symfony2Profiler 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 Symfony2Profiler y Toolbar al rescate!
  • 33.
    Optimización: backend Basede 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 Operacionescomplejas / bloqueantes Eliminar el sincronismo: tareas automáticas o sistemas de cola de mensajes (RabbitMQ). http://vimeo.com/26150500
  • 35.
    Optimización: backend Mejorasen Symfony Volcar todas las rutas en un .htaccess (app/console --env=prod router:dump) Autoload con ApcUniversalClassLoader (en vez de con UniversalClassLoader).
  • 36.
  • 37.
    Optimización: frontend Todavíahay 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 Problemasmás comunes Imágenes muy pesadas. Múltiples archivos CSS/JS sin “minificar”. Demasiadas conexiones. “ Cache headers” mal configuradas.
  • 40.
    Optimización: frontend Herramientasindispensables 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ágenesProgramas 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 ArchivosCSS/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 AsseticAssetic 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?