symfony2: optimización y rendimiento

48
Optimización y Rendimie Raúl Fraile Beneyto

Upload: raul-fraile

Post on 17-Dec-2014

7.609 views

Category:

Technology


3 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Symfony2: Optimización y rendimiento

Optimización y RendimientoRaúl Fraile Beneyto

Page 2: Symfony2: Optimización y rendimiento

¿Quién soy?

Raúl Fraile Beneyto

Co-fundador del proyecto Facultia

Programador PHP/Symfony

Symfony2 “Evangelist”

Page 3: Symfony2: Optimización y rendimiento
Page 4: Symfony2: Optimización y rendimiento

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

Are you sure, Fabien?

Page 6: Symfony2: Optimización y rendimiento
Page 7: Symfony2: Optimización y rendimiento

¿Cómo lo consigue?

caché3

+ PHP 5.3.2 + Lazy Loading + ESI + APC...

Page 8: Symfony2: Optimización y rendimiento

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
Page 10: Symfony2: Optimización y rendimiento

PHP 5.3

Page 11: Symfony2: Optimización y rendimiento

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

Lazy loading

Page 13: Symfony2: Optimización y rendimiento

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

HTTPCache

Page 15: Symfony2: Optimización y rendimiento

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

HTTP Cache

Page 17: Symfony2: Optimización y rendimiento

HTTP Cache

<esi:include src="http://..." />

Page 18: Symfony2: Optimización y rendimiento

HTTP Cache

60' 10'

1'

Page 19: Symfony2: Optimización y rendimiento

PHP Accelerator

Page 20: Symfony2: Optimización y rendimiento

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

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

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

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

Twig

Page 25: Symfony2: Optimización y rendimiento

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

Vale, Symfony2 es rápido...

… ¿y nosotros?

Page 27: Symfony2: Optimización y rendimiento

Backend VS Frontend

Page 28: Symfony2: Optimización y rendimiento

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

Backend

Page 30: Symfony2: Optimización y rendimiento

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

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

Optimización: backend

Symfony2 Profiler y Toolbar al rescate!

Page 33: Symfony2: Optimización y rendimiento

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

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

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

Frontend

Page 37: Symfony2: Optimización y rendimiento

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
Page 39: Symfony2: Optimización y rendimiento

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

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

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

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
Page 44: Symfony2: Optimización y rendimiento
Page 45: Symfony2: Optimización y rendimiento

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

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

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

¡Gracias!

E-mail: [email protected]

Twitter: @raulfraile

Github: raulfraile

http://www.slideshare.net/raulfraile

¿Preguntas o nosvamos a comer?