SlideShare a Scribd company logo
1 of 64
Asier Marqués @asiermarques Socio fundador de Blackslot.com Socio fundador de Artesanio.com Organizador de #webdevbilbao Arquitecto web, ex-administrador de sistemas Microsoft, apasionado de la creación de servicios en internet y adicto al café. Escribo en asiermarques.com
Rendimiento Web
El rendimiento importa Según kissmetrics.com: El 73% de los usuarios de móvil ha encontrado algún sitio web demasiado lento en cargar. El 47% de los usuarios esperan un máximo de 2 segundos a que  cargue una página web en la que van a comprar  algo.  Si un sitio de comercio electrónico está ganando $ 100.000 por día, un retraso de 1 segundo en la página podría costar $ 2.5 millones de perdidas al año.http://blog.kissmetrics.com/loading-time
Rendimiento no es escalabilidad Pero es clave que la aplicación esté bien diseñada y sea escalable.
Cómo diseñar bien No te repitas. DRY Divide. MVC Calidad. TDD Symfony2 te ayuda a conseguirlo.
“la optimización prematura es la raíz de todo mal” Donald Knuth
Antes de optimizar No resuelvas problemas que no tienes No tomes decisiones tecnológicas en base a lo que hacen “los grandes” Monitoriza, estudia la información y después optimiza Evita operaciones síncronas que supongan demora
Usa InnoDB!
MyISAM Bloqueos a nivel de tabla, no de fila Los selects pesados bloquean la tabla frente a escritura Las escrituras bloquean la tabla LOW_PRIORITY,  HIGH_PRIORITY http://dev.mysql.com/doc/refman/5.0/en/table-locking.html No soporta transacciones No es relacional
InnoDB Relacional Bloqueos de fila, no de tabla Soporta transacciones Doctrine2 hace uso interno de transacciones
Configuración Innodb_buffer_pool_size Innodb_log_file_size Innodb_flush_log_at_trx_commit=2 innodb_flush_method=O_DIRECT innodb_file_per_table
Query Cache http://dev.mysql.com/doc/refman/5.1/en/query-cache-status-and-maintenance.html query_cache_type = 1  # 0 desactivada, 1 activada, 2 bajo demanda query_cache_size  =  <tamaño de cache> SHOW STATUS LIKE 'Qcache%'; ! -> Qcache_hits: Número de aciertos de la querycaché. ! -> Qcache_lowmem_prunes: El número de consultas eliminadas de la cache por falta de memoria disponible. ! -> Qcache_inserts: El número de consultas insertadas a la cache.
El espacio importa
Divide Particionado Vertical (por columna) Horizontal (por fila) http://mysql.isu.edu.tw/tech-resources/articles/testing-partitions-large-db.html Mantener los datos de texto opcionales en otra tabla Configura InnoDBcon innodb_file_per_table Cada archivo maneja 1) Los datos de la tabla 2) Los datos de los índices 3) Los MVCC (Multiversioning Concurrency Control)  4) La metainformación de la tabla Optimize Table reduce la información de cadaarchivo y reorganiza los índices
Índices Usa EXPLAIN para saber cuando utilizarlos NOT NULL cuando sea posible Una columna indexada que pueda ser NULL ocupa más espacio Usa el tipo de datos correcto
EXPLAIN <QUERY>  Valores en los que fijarte type ALL indica que debe recorrerse toda la tabla y debe evitarse INDEX se debe recorrer todo el índice key y key_len Cuanto menor sea el valor de KeyLen mejor Key te indica el Índice elegido para la consulta EXTRA Evitar Filesort y tablas temporales Las tablas temporales aparecen al ordenar resultados o al hacer agrupaciones
Índices y espacio: Tipos de datos Usa INT en claves primarias como unsigneden lugar de BIGINT. Usa TINYINT en lugar de INT(1). TINYINT es 1 Byte, INT(1) son 4 Usa BIT para booleanos en lugar de INT(1) o TINYINT Usa TIMESTAMP en lugar de DATETIME TIMESTAMP son 4 Bytes, DATETIME son 8
Índices y espacio: Tipos de datos Usa CHAR(num) en lugar de VARCHAR(num) para valores fijos No uses palabras en ENUM(),usa un solo carácter si es posible Usa unsigned INT para guardar ips, no varchar Usa utf8 cuando sea realmente necesario Varchar(255) en utf8 son más de 700 bytes
Conoce tus consultas Es peor tener 83 consultas simples que una consulta “compleja” No hagas operaciones matemáticas en tus consultas Aligera en la medida de lo posible tus consultas No hagas JOINs en campos que no tengan índice Cuidado con los count y los order
Conoce tus consultas Count(*) Usa mejor SQL_CALC_FOUND_ROWS OrderBy filesort en la mayoría de los casos recupera los PK en una consulta simple antes de hacer una consulta compleja
Ejemplo típico en doctrine Es típico hacer consultas innecesarias dentro de un bucle. Tomemos por ejemplo la aplicación de #desymfony
Vista de Ponentes Se ejecuta el siguiente dql en el controlador SELECT p      FROM DesymfonyesymfonyBundlentityonente p ORDER BY p.nombreASC Y en la vista se hace {% for ponente in ponentes %}     …             {% for ponencia in ponente.ponencias %}
Resultado Cada iteración de Ponente hace una query de Ponencias Tenemos 13 ponentes, se ejecutan 13 querys Con 200 ponentes, se ejecutarían 200 querys
La solución es sencilla En el DQL SELECT p, po FROM DesymfonyesymfonyBundlentityonente p INNER JOIN p.ponenciaspo ORDER BY p.nombre ASC Solamente con añadir el INNER JOIN reducimos el número de querys a tan sólo una en lugar de 13 o (n).
Symfony y Doctrine Usar arrays en las vistas en lugar de objetos Usar la cache de doctrine Cache de DQL $config->setMetadataCacheImpl(new DoctrineommonachepcCache()); Cache de resultados $config->setQueryCacheImpl(new DoctrineommonachepcCache());
Búsqueda InnoDB no soporta FULLTEXT Sphinx, Lucene, Solr Buenas opciones incluso para reducir complejidad en consultas,  pe. Ordenar, filtros complejos..
Analiza Debesllevar un control de lo quesucede a diario en tuservidory comparar los valoresqueobtengascuandoestetengaproblemas con tusvaloresnormales. Herramientas: Munin, Nagios, Cacti..
Analiza mysqladminextended Threads_running Número de consultasque se estánejecutando.  Handler_read_rnd_next y Handler_read_first Si esmuy superior a lo normal puedeque sea debido a un problema con los índices. Handler_rollback El número de rollbacks que se hanhecho. Select_full_join Joins sin índices, debeser cero. Slow_queries Si este valor creceindicaproblemas en el rendimiento de la aplicación.
Analiza SHOW FULL PROCESS LIST  Para saber cuánto tardan las consultas pesadas en ejecutarse y las que se encuentran en estado “Locked” SHOW TABLE STATUS FROM <base datos> LIKE ‘<nombre>’ Comprobar el espacio de la tabla (el Max_data_lengthnuncapuedeserconsumidoporcompleto) EXPLAIN [EXTENDED] <query> SHOW INNODB STATUS Estadísticas de acceso a disco, transacciones, consultas con problemas de integridad.. SHOW PROFILE  Comprobar los recursos de hardware consumidos por una query http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html
NO SQL No lo uses por moda, conoce la tecnología y los problemas que solventa Conoce sus posibilidades de escalado Conoce su rendimiento Conoce sus posibilidades de backup/restore! Funciona bien como frontend de una base relacional si su motor es rápido Buena alternativa a desnormalizar
Cache
Http Cache – RFC 2616 Symfony2 implementa la cache definida en el RFC Sigue los conceptos Expiración-Validación Symfony2 tiene su propio proxy cache pero permite ser integrado con sistemas proxy cache como Varnish.
Cache-Control Public Todos los usuarios comparten la cache Private La cache es distinta para cada usuario No-Cache No se cachea en ningún caso En Symfony2 por defecto es no-cache o private
Expires y Cache-Control: max-age expires (fecha GMT) Frescura = expires – fecha actual max-age (segundos) s-maxage se usa por servidores proxy, es público por lo que es común a todos los usuarios max-age tiene prioridad sobre Expires  ..y s-maxage sobre el max-age si es pública
expires y max-age en Symfony2        $response = $this                                    ->render('DesymfonyBundle:Ponente:index.html.twig',  array('ponentes' => $ponentes));        $response->setPublic();       $response->setMaxAge(10); <- Private $response->setSharedMaxAge(10); <- Public        $date =newDateTime();       $date->modify('+60 seconds'); $response->setExpires($date); <- Private(si no hay un setPublic())        return$response;    
expires y max-age en Symfony2 Primera carga de la página, 234ms Carga desde la caché, 3ms
Validación: LastModified y ETAG LastModified Fecha de última modificación del archivo, si el servidor retorna una fecha menor a la de la caché del cliente, descargará el archivo. Etag El navegador cachea el archivo identificándolo con el valor del Etag. El navegador comprobará si debe servir el archivo comparando el Etag del servidor con el valor que él tiene almacenado en su cache, para ello usará el campo If-None-Match
LastModified y ETAG en Symfony2 //debemos crear los métodos en la entidad $etag            = $entity->getCurrentETag(); $mod_date = $entity->getLastModification(); $response->setETag($etag);$response->setLastModified($mod_date); if($response->isNotModified($this->get('request'))) {    …
Varnish
Varnish Proxy cache Balanceador de carga Lenguaje de configuración VCL Soporte para ESI y HTTP Cache
Varnish Declaramos el servidor o servidores web frontales Podemos especificar qué es lo que queremos cachear Retornando pass evitamos que se cachee y con lookup forzamos a que se busque en el cache
Varnish Podemos indicar un ttl para el objeto en la cache También podemos evaluar si queremos cachear desde aquí
Varnish: invalidar cache Indicamos los Host que pueden lanzar peticiones de invalidación Si el request es de tipo PURGE se elimina la url del host especificado  curl -X PURGE http://dominio.com/url-a-invalidar
Varnish: ESI
Varnish: ESI SI una url contiene tags ESI basta con indicar esi; para que Varnish lo procese Podemos establecer que si la ruta es /esi/* le ponga otro ttl o retorne pass, evitando que se cachee
Varnish con Symfony2 En la plantilla {% render'...:vista' with {}, {'standalone': true} %} Devuelve.. <esi:includesrc=“http://dominio/url_al_contenido”/> Symfony2 añade automáticamente sólo cuando use ESI un headerSurrogate-Control= "abc=ESI/1.0“. En Varnish le debemos indicar que es capáz de procesar ESI con set req.http.Surrogate-Capability = "abc=ESI/1.0“. http://symfony.com/doc/2.0/cookbook/cache/varnish.html
Más cosas
APC ByteCode cache para PHP APC.STAT = 0 En producción si no hay cambios frecuentes
Assetic Agrupa los estáticos indicados de tu sitio web en un único archivo. Se puede escribir en disco, en un cdn (pe.Amazon s3) o manejar como string.  Comprime y optimiza los css, js e imágenes. Reduce las peticiones HTTP Se integra con HTTP Cache de Symfony2 y con la sintaxis de Twig
Assetic $assets= new AssetCollection( array( new FileAsset(“web/Bundle/style.css”), new GlobAsset(“web/*.css”), )                    ); $assets->load(); $writer = new AssetWriter(“s3://bucket”); $writer->writeManagerAssets($assets);
Assetic en Symfony2 {% javascripts'@Bundle/Resources/public/js/*' filter=‘nombre_js' %}       <script src="{{ asset_url }}"></script>  {% endjavascripts%} $ phpapp/consoleassetic:dump  s3://bucket
Usa un CDN público Ahorro de ancho de banda El navegador probablemente tenga ya cacheadas las librerías comunes (pe. jquery)
Operaciones en tiempo real El tiempo real no es necesario en la mayoría de los casos. Envío de emails Procesamiento de imágenes Invalidaciones de cache Herramientas: RabbitMQ, Gearman. Otras soluciones: Queue de Switfmailer Implementar nuestra solución en memcached, redis..
Usa Html5 y CSS3
Async
Cache Manifest <htmllang="en" manifest=“ejemplo.manifest"> CACHE MANIFEST  CACHE clock.js  clock.css NETWORK no_se_cachea.php
Cache Manifest El manifiesto se descarga en base a nuestras indicaciones en el HTTP Cache ..o forzándolo con JavaScript mediante el método window.applicationCache La caché se invalida mediante una comparación byte-for-byte entre el archivomásreciente y el anterior.
No uses imágenes, usa CSS3 Border-radius Gradient Text-shadow y Box-shadow Canvas Font-face
¿Preguntas?
Gracias Asier Marqués Blackslot @asiermarques linkedin.com/in/asier asiermarques@blackslot.com Imágenes http://www.flickr.com/photos/caharley72/11332057 http://www.flickr.com/photos/poetatum/3457696479 http://www.flickr.com/photos/32299138@N08/5772093221 http://www.flickr.com/photos/aereimilitariorg/3956024476 http://www.flickr.com/photos/zombieite/5181067906 http://www.flickr.com/photos/bcash67/4496036286

More Related Content

What's hot

What's hot (17)

Conociendo PHP
Conociendo PHPConociendo PHP
Conociendo PHP
 
Que es wamp server
Que es wamp serverQue es wamp server
Que es wamp server
 
Wampserver caracteristicas y especificaciones
Wampserver caracteristicas y especificacionesWampserver caracteristicas y especificaciones
Wampserver caracteristicas y especificaciones
 
Introducción a programación con PHP
Introducción a programación con PHPIntroducción a programación con PHP
Introducción a programación con PHP
 
desarrolo de sitios web php y mysql
desarrolo de sitios web php y mysqldesarrolo de sitios web php y mysql
desarrolo de sitios web php y mysql
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain
 
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y AngularDesarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
 
Que es php
Que es phpQue es php
Que es php
 
Pc02 13
Pc02 13Pc02 13
Pc02 13
 
Manual de php con ejercicios
Manual de php con ejerciciosManual de php con ejercicios
Manual de php con ejercicios
 
Php basico
Php basicoPhp basico
Php basico
 
Xampp+Wordpress
Xampp+WordpressXampp+Wordpress
Xampp+Wordpress
 
Iniciacion a PHP (I)
Iniciacion a PHP (I)Iniciacion a PHP (I)
Iniciacion a PHP (I)
 
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Magallanes, Herramienta de despliegue PHP sencilla y poderosa�Magallanes, Herramienta de despliegue PHP sencilla y poderosa�
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
 
Introducción a Ansible
Introducción a AnsibleIntroducción a Ansible
Introducción a Ansible
 
Joomla
JoomlaJoomla
Joomla
 
Wamp server
Wamp serverWamp server
Wamp server
 

Similar to Rendimiento en aplicaciones web con Symfony2

Curso migración de aplicaciones nsl nk90 a tmp
Curso migración de aplicaciones nsl nk90 a tmpCurso migración de aplicaciones nsl nk90 a tmp
Curso migración de aplicaciones nsl nk90 a tmpEdgar Solis
 
Rendimiento en magento
Rendimiento en magentoRendimiento en magento
Rendimiento en magentoOnestic
 
Carbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshareCarbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshareJulián Castiblanco
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii1 2d
 
Sql dinamico14042011
Sql dinamico14042011Sql dinamico14042011
Sql dinamico14042011josecuartas
 
Modificacion de registros de windows
Modificacion de registros de windows Modificacion de registros de windows
Modificacion de registros de windows Marp Aerov
 
Bases de Datos en en www.fiec.espol.edu.ec
Bases de Datos en  en www.fiec.espol.edu.ecBases de Datos en  en www.fiec.espol.edu.ec
Bases de Datos en en www.fiec.espol.edu.ecSilvana Vargas
 
Java y Bases de Datos
Java y Bases de DatosJava y Bases de Datos
Java y Bases de DatosRonny Parra
 
Bases Datos en java
Bases Datos en javaBases Datos en java
Bases Datos en javajent46
 
Escalabilidad - Apache y MySQL
Escalabilidad - Apache y MySQLEscalabilidad - Apache y MySQL
Escalabilidad - Apache y MySQLLorena Fernández
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slonyJohanna Mendez
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slonyJohanna Mendez
 
0157 genexus full_throttling
0157 genexus full_throttling0157 genexus full_throttling
0157 genexus full_throttlingGeneXus
 
0157 genexus full_throttling
0157 genexus full_throttling0157 genexus full_throttling
0157 genexus full_throttlingGeneXus
 
Administrando la Instancia en Oracle database 11g-Z052 05
Administrando la Instancia en Oracle database 11g-Z052 05Administrando la Instancia en Oracle database 11g-Z052 05
Administrando la Instancia en Oracle database 11g-Z052 05Alexander Calderón
 

Similar to Rendimiento en aplicaciones web con Symfony2 (20)

Postgresql expo
Postgresql expoPostgresql expo
Postgresql expo
 
Curso migración de aplicaciones nsl nk90 a tmp
Curso migración de aplicaciones nsl nk90 a tmpCurso migración de aplicaciones nsl nk90 a tmp
Curso migración de aplicaciones nsl nk90 a tmp
 
Tuning fondo-negro-2
Tuning fondo-negro-2Tuning fondo-negro-2
Tuning fondo-negro-2
 
Rendimiento en magento
Rendimiento en magentoRendimiento en magento
Rendimiento en magento
 
Seguridad En Programación
Seguridad En ProgramaciónSeguridad En Programación
Seguridad En Programación
 
Carbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshareCarbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshare
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Sql dinamico14042011
Sql dinamico14042011Sql dinamico14042011
Sql dinamico14042011
 
SQL avanzado
SQL avanzadoSQL avanzado
SQL avanzado
 
Modificacion de registros de windows
Modificacion de registros de windows Modificacion de registros de windows
Modificacion de registros de windows
 
Bases de Datos en en www.fiec.espol.edu.ec
Bases de Datos en  en www.fiec.espol.edu.ecBases de Datos en  en www.fiec.espol.edu.ec
Bases de Datos en en www.fiec.espol.edu.ec
 
Java y Bases de Datos
Java y Bases de DatosJava y Bases de Datos
Java y Bases de Datos
 
Java y Bases Datos
Java y Bases DatosJava y Bases Datos
Java y Bases Datos
 
Bases Datos en java
Bases Datos en javaBases Datos en java
Bases Datos en java
 
Escalabilidad - Apache y MySQL
Escalabilidad - Apache y MySQLEscalabilidad - Apache y MySQL
Escalabilidad - Apache y MySQL
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slony
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slony
 
0157 genexus full_throttling
0157 genexus full_throttling0157 genexus full_throttling
0157 genexus full_throttling
 
0157 genexus full_throttling
0157 genexus full_throttling0157 genexus full_throttling
0157 genexus full_throttling
 
Administrando la Instancia en Oracle database 11g-Z052 05
Administrando la Instancia en Oracle database 11g-Z052 05Administrando la Instancia en Oracle database 11g-Z052 05
Administrando la Instancia en Oracle database 11g-Z052 05
 

More from Asier Marqués

Desarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando SymfonyDesarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando SymfonyAsier Marqués
 
Creando Productos SaaS
Creando Productos SaaSCreando Productos SaaS
Creando Productos SaaSAsier Marqués
 
WordCamp Cantabria - Código mantenible con WordPress
WordCamp Cantabria  - Código mantenible con WordPressWordCamp Cantabria  - Código mantenible con WordPress
WordCamp Cantabria - Código mantenible con WordPressAsier Marqués
 
Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Asier Marqués
 
Ejecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en InternetEjecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en InternetAsier Marqués
 
Desarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsDesarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsAsier Marqués
 
Presentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.orgPresentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.orgAsier Marqués
 
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1Asier Marqués
 
Albero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarinAlbero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarinAsier Marqués
 
Bilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con XamarinBilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con XamarinAsier Marqués
 
APIs REST #devfestBilbao
APIs REST #devfestBilbaoAPIs REST #devfestBilbao
APIs REST #devfestBilbaoAsier Marqués
 
Silex para aplicaciones web MVC
Silex para aplicaciones web MVCSilex para aplicaciones web MVC
Silex para aplicaciones web MVCAsier Marqués
 
Servicios REST - PucelaTechDay
Servicios REST - PucelaTechDayServicios REST - PucelaTechDay
Servicios REST - PucelaTechDayAsier Marqués
 
Desarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internetDesarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internetAsier Marqués
 
BilboStack - Php en el 2012
BilboStack - Php en el 2012BilboStack - Php en el 2012
BilboStack - Php en el 2012Asier Marqués
 
4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbao4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbaoAsier Marqués
 
Proyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbaoProyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbaoAsier Marqués
 

More from Asier Marqués (20)

Desarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando SymfonyDesarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando Symfony
 
Creando Productos SaaS
Creando Productos SaaSCreando Productos SaaS
Creando Productos SaaS
 
Introducción a Bolt
Introducción a BoltIntroducción a Bolt
Introducción a Bolt
 
WordCamp Cantabria - Código mantenible con WordPress
WordCamp Cantabria  - Código mantenible con WordPressWordCamp Cantabria  - Código mantenible con WordPress
WordCamp Cantabria - Código mantenible con WordPress
 
PHP en el 2015
PHP en el 2015PHP en el 2015
PHP en el 2015
 
Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Código mantenible, en Wordpress.
Código mantenible, en Wordpress.
 
Ejecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en InternetEjecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en Internet
 
Desarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsDesarrollo de Mobile Web Apps
Desarrollo de Mobile Web Apps
 
Presentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.orgPresentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.org
 
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
 
Albero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarinAlbero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarin
 
Bilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con XamarinBilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con Xamarin
 
APIs REST #devfestBilbao
APIs REST #devfestBilbaoAPIs REST #devfestBilbao
APIs REST #devfestBilbao
 
Silex para aplicaciones web MVC
Silex para aplicaciones web MVCSilex para aplicaciones web MVC
Silex para aplicaciones web MVC
 
Servicios REST - PucelaTechDay
Servicios REST - PucelaTechDayServicios REST - PucelaTechDay
Servicios REST - PucelaTechDay
 
Desarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internetDesarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internet
 
REST - deSymfony2012
REST - deSymfony2012REST - deSymfony2012
REST - deSymfony2012
 
BilboStack - Php en el 2012
BilboStack - Php en el 2012BilboStack - Php en el 2012
BilboStack - Php en el 2012
 
4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbao4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbao
 
Proyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbaoProyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbao
 

Recently uploaded

TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramDIDIERFERNANDOGUERRE
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel tallerValentinaTabares11
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 

Recently uploaded (20)

TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ram
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel taller
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 

Rendimiento en aplicaciones web con Symfony2

  • 1.
  • 2.
  • 3. Asier Marqués @asiermarques Socio fundador de Blackslot.com Socio fundador de Artesanio.com Organizador de #webdevbilbao Arquitecto web, ex-administrador de sistemas Microsoft, apasionado de la creación de servicios en internet y adicto al café. Escribo en asiermarques.com
  • 5. El rendimiento importa Según kissmetrics.com: El 73% de los usuarios de móvil ha encontrado algún sitio web demasiado lento en cargar. El 47% de los usuarios esperan un máximo de 2 segundos a que cargue una página web en la que van a comprar algo.  Si un sitio de comercio electrónico está ganando $ 100.000 por día, un retraso de 1 segundo en la página podría costar $ 2.5 millones de perdidas al año.http://blog.kissmetrics.com/loading-time
  • 6. Rendimiento no es escalabilidad Pero es clave que la aplicación esté bien diseñada y sea escalable.
  • 7. Cómo diseñar bien No te repitas. DRY Divide. MVC Calidad. TDD Symfony2 te ayuda a conseguirlo.
  • 8. “la optimización prematura es la raíz de todo mal” Donald Knuth
  • 9. Antes de optimizar No resuelvas problemas que no tienes No tomes decisiones tecnológicas en base a lo que hacen “los grandes” Monitoriza, estudia la información y después optimiza Evita operaciones síncronas que supongan demora
  • 10.
  • 12. MyISAM Bloqueos a nivel de tabla, no de fila Los selects pesados bloquean la tabla frente a escritura Las escrituras bloquean la tabla LOW_PRIORITY, HIGH_PRIORITY http://dev.mysql.com/doc/refman/5.0/en/table-locking.html No soporta transacciones No es relacional
  • 13. InnoDB Relacional Bloqueos de fila, no de tabla Soporta transacciones Doctrine2 hace uso interno de transacciones
  • 14. Configuración Innodb_buffer_pool_size Innodb_log_file_size Innodb_flush_log_at_trx_commit=2 innodb_flush_method=O_DIRECT innodb_file_per_table
  • 15. Query Cache http://dev.mysql.com/doc/refman/5.1/en/query-cache-status-and-maintenance.html query_cache_type = 1 # 0 desactivada, 1 activada, 2 bajo demanda query_cache_size = <tamaño de cache> SHOW STATUS LIKE 'Qcache%'; ! -> Qcache_hits: Número de aciertos de la querycaché. ! -> Qcache_lowmem_prunes: El número de consultas eliminadas de la cache por falta de memoria disponible. ! -> Qcache_inserts: El número de consultas insertadas a la cache.
  • 16.
  • 18. Divide Particionado Vertical (por columna) Horizontal (por fila) http://mysql.isu.edu.tw/tech-resources/articles/testing-partitions-large-db.html Mantener los datos de texto opcionales en otra tabla Configura InnoDBcon innodb_file_per_table Cada archivo maneja 1) Los datos de la tabla 2) Los datos de los índices 3) Los MVCC (Multiversioning Concurrency Control) 4) La metainformación de la tabla Optimize Table reduce la información de cadaarchivo y reorganiza los índices
  • 19. Índices Usa EXPLAIN para saber cuando utilizarlos NOT NULL cuando sea posible Una columna indexada que pueda ser NULL ocupa más espacio Usa el tipo de datos correcto
  • 20. EXPLAIN <QUERY> Valores en los que fijarte type ALL indica que debe recorrerse toda la tabla y debe evitarse INDEX se debe recorrer todo el índice key y key_len Cuanto menor sea el valor de KeyLen mejor Key te indica el Índice elegido para la consulta EXTRA Evitar Filesort y tablas temporales Las tablas temporales aparecen al ordenar resultados o al hacer agrupaciones
  • 21. Índices y espacio: Tipos de datos Usa INT en claves primarias como unsigneden lugar de BIGINT. Usa TINYINT en lugar de INT(1). TINYINT es 1 Byte, INT(1) son 4 Usa BIT para booleanos en lugar de INT(1) o TINYINT Usa TIMESTAMP en lugar de DATETIME TIMESTAMP son 4 Bytes, DATETIME son 8
  • 22. Índices y espacio: Tipos de datos Usa CHAR(num) en lugar de VARCHAR(num) para valores fijos No uses palabras en ENUM(),usa un solo carácter si es posible Usa unsigned INT para guardar ips, no varchar Usa utf8 cuando sea realmente necesario Varchar(255) en utf8 son más de 700 bytes
  • 23. Conoce tus consultas Es peor tener 83 consultas simples que una consulta “compleja” No hagas operaciones matemáticas en tus consultas Aligera en la medida de lo posible tus consultas No hagas JOINs en campos que no tengan índice Cuidado con los count y los order
  • 24. Conoce tus consultas Count(*) Usa mejor SQL_CALC_FOUND_ROWS OrderBy filesort en la mayoría de los casos recupera los PK en una consulta simple antes de hacer una consulta compleja
  • 25. Ejemplo típico en doctrine Es típico hacer consultas innecesarias dentro de un bucle. Tomemos por ejemplo la aplicación de #desymfony
  • 26. Vista de Ponentes Se ejecuta el siguiente dql en el controlador SELECT p FROM DesymfonyesymfonyBundlentityonente p ORDER BY p.nombreASC Y en la vista se hace {% for ponente in ponentes %} … {% for ponencia in ponente.ponencias %}
  • 27. Resultado Cada iteración de Ponente hace una query de Ponencias Tenemos 13 ponentes, se ejecutan 13 querys Con 200 ponentes, se ejecutarían 200 querys
  • 28. La solución es sencilla En el DQL SELECT p, po FROM DesymfonyesymfonyBundlentityonente p INNER JOIN p.ponenciaspo ORDER BY p.nombre ASC Solamente con añadir el INNER JOIN reducimos el número de querys a tan sólo una en lugar de 13 o (n).
  • 29. Symfony y Doctrine Usar arrays en las vistas en lugar de objetos Usar la cache de doctrine Cache de DQL $config->setMetadataCacheImpl(new DoctrineommonachepcCache()); Cache de resultados $config->setQueryCacheImpl(new DoctrineommonachepcCache());
  • 30. Búsqueda InnoDB no soporta FULLTEXT Sphinx, Lucene, Solr Buenas opciones incluso para reducir complejidad en consultas, pe. Ordenar, filtros complejos..
  • 31. Analiza Debesllevar un control de lo quesucede a diario en tuservidory comparar los valoresqueobtengascuandoestetengaproblemas con tusvaloresnormales. Herramientas: Munin, Nagios, Cacti..
  • 32. Analiza mysqladminextended Threads_running Número de consultasque se estánejecutando. Handler_read_rnd_next y Handler_read_first Si esmuy superior a lo normal puedeque sea debido a un problema con los índices. Handler_rollback El número de rollbacks que se hanhecho. Select_full_join Joins sin índices, debeser cero. Slow_queries Si este valor creceindicaproblemas en el rendimiento de la aplicación.
  • 33. Analiza SHOW FULL PROCESS LIST Para saber cuánto tardan las consultas pesadas en ejecutarse y las que se encuentran en estado “Locked” SHOW TABLE STATUS FROM <base datos> LIKE ‘<nombre>’ Comprobar el espacio de la tabla (el Max_data_lengthnuncapuedeserconsumidoporcompleto) EXPLAIN [EXTENDED] <query> SHOW INNODB STATUS Estadísticas de acceso a disco, transacciones, consultas con problemas de integridad.. SHOW PROFILE Comprobar los recursos de hardware consumidos por una query http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html
  • 34. NO SQL No lo uses por moda, conoce la tecnología y los problemas que solventa Conoce sus posibilidades de escalado Conoce su rendimiento Conoce sus posibilidades de backup/restore! Funciona bien como frontend de una base relacional si su motor es rápido Buena alternativa a desnormalizar
  • 35. Cache
  • 36. Http Cache – RFC 2616 Symfony2 implementa la cache definida en el RFC Sigue los conceptos Expiración-Validación Symfony2 tiene su propio proxy cache pero permite ser integrado con sistemas proxy cache como Varnish.
  • 37. Cache-Control Public Todos los usuarios comparten la cache Private La cache es distinta para cada usuario No-Cache No se cachea en ningún caso En Symfony2 por defecto es no-cache o private
  • 38. Expires y Cache-Control: max-age expires (fecha GMT) Frescura = expires – fecha actual max-age (segundos) s-maxage se usa por servidores proxy, es público por lo que es común a todos los usuarios max-age tiene prioridad sobre Expires ..y s-maxage sobre el max-age si es pública
  • 39. expires y max-age en Symfony2 $response = $this ->render('DesymfonyBundle:Ponente:index.html.twig', array('ponentes' => $ponentes));        $response->setPublic();       $response->setMaxAge(10); <- Private $response->setSharedMaxAge(10); <- Public   $date =newDateTime(); $date->modify('+60 seconds'); $response->setExpires($date); <- Private(si no hay un setPublic())        return$response;    
  • 40. expires y max-age en Symfony2 Primera carga de la página, 234ms Carga desde la caché, 3ms
  • 41. Validación: LastModified y ETAG LastModified Fecha de última modificación del archivo, si el servidor retorna una fecha menor a la de la caché del cliente, descargará el archivo. Etag El navegador cachea el archivo identificándolo con el valor del Etag. El navegador comprobará si debe servir el archivo comparando el Etag del servidor con el valor que él tiene almacenado en su cache, para ello usará el campo If-None-Match
  • 42. LastModified y ETAG en Symfony2 //debemos crear los métodos en la entidad $etag = $entity->getCurrentETag(); $mod_date = $entity->getLastModification(); $response->setETag($etag);$response->setLastModified($mod_date); if($response->isNotModified($this->get('request'))) { …
  • 44. Varnish Proxy cache Balanceador de carga Lenguaje de configuración VCL Soporte para ESI y HTTP Cache
  • 45. Varnish Declaramos el servidor o servidores web frontales Podemos especificar qué es lo que queremos cachear Retornando pass evitamos que se cachee y con lookup forzamos a que se busque en el cache
  • 46. Varnish Podemos indicar un ttl para el objeto en la cache También podemos evaluar si queremos cachear desde aquí
  • 47. Varnish: invalidar cache Indicamos los Host que pueden lanzar peticiones de invalidación Si el request es de tipo PURGE se elimina la url del host especificado curl -X PURGE http://dominio.com/url-a-invalidar
  • 49. Varnish: ESI SI una url contiene tags ESI basta con indicar esi; para que Varnish lo procese Podemos establecer que si la ruta es /esi/* le ponga otro ttl o retorne pass, evitando que se cachee
  • 50. Varnish con Symfony2 En la plantilla {% render'...:vista' with {}, {'standalone': true} %} Devuelve.. <esi:includesrc=“http://dominio/url_al_contenido”/> Symfony2 añade automáticamente sólo cuando use ESI un headerSurrogate-Control= "abc=ESI/1.0“. En Varnish le debemos indicar que es capáz de procesar ESI con set req.http.Surrogate-Capability = "abc=ESI/1.0“. http://symfony.com/doc/2.0/cookbook/cache/varnish.html
  • 52. APC ByteCode cache para PHP APC.STAT = 0 En producción si no hay cambios frecuentes
  • 53. Assetic Agrupa los estáticos indicados de tu sitio web en un único archivo. Se puede escribir en disco, en un cdn (pe.Amazon s3) o manejar como string. Comprime y optimiza los css, js e imágenes. Reduce las peticiones HTTP Se integra con HTTP Cache de Symfony2 y con la sintaxis de Twig
  • 54. Assetic $assets= new AssetCollection( array( new FileAsset(“web/Bundle/style.css”), new GlobAsset(“web/*.css”), ) ); $assets->load(); $writer = new AssetWriter(“s3://bucket”); $writer->writeManagerAssets($assets);
  • 55. Assetic en Symfony2 {% javascripts'@Bundle/Resources/public/js/*' filter=‘nombre_js' %} <script src="{{ asset_url }}"></script> {% endjavascripts%} $ phpapp/consoleassetic:dump s3://bucket
  • 56. Usa un CDN público Ahorro de ancho de banda El navegador probablemente tenga ya cacheadas las librerías comunes (pe. jquery)
  • 57. Operaciones en tiempo real El tiempo real no es necesario en la mayoría de los casos. Envío de emails Procesamiento de imágenes Invalidaciones de cache Herramientas: RabbitMQ, Gearman. Otras soluciones: Queue de Switfmailer Implementar nuestra solución en memcached, redis..
  • 58. Usa Html5 y CSS3
  • 59. Async
  • 60. Cache Manifest <htmllang="en" manifest=“ejemplo.manifest"> CACHE MANIFEST CACHE clock.js clock.css NETWORK no_se_cachea.php
  • 61. Cache Manifest El manifiesto se descarga en base a nuestras indicaciones en el HTTP Cache ..o forzándolo con JavaScript mediante el método window.applicationCache La caché se invalida mediante una comparación byte-for-byte entre el archivomásreciente y el anterior.
  • 62. No uses imágenes, usa CSS3 Border-radius Gradient Text-shadow y Box-shadow Canvas Font-face
  • 64. Gracias Asier Marqués Blackslot @asiermarques linkedin.com/in/asier asiermarques@blackslot.com Imágenes http://www.flickr.com/photos/caharley72/11332057 http://www.flickr.com/photos/poetatum/3457696479 http://www.flickr.com/photos/32299138@N08/5772093221 http://www.flickr.com/photos/aereimilitariorg/3956024476 http://www.flickr.com/photos/zombieite/5181067906 http://www.flickr.com/photos/bcash67/4496036286