symfony2: optimización y rendimiento

Post on 17-Dec-2014

7.610 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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: raulfraile@gmail.com

Twitter: @raulfraile

Github: raulfraile

http://www.slideshare.net/raulfraile

¿Preguntas o nosvamos a comer?

top related