Upload
fran-dieguez
View
422
Download
3
Embed Size (px)
Citation preview
Como facer appsfodidamente rápidas: con PHP
Fran Diéguez – OpenHost
ttEste traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
2
Sobre min
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
3
Ola, son Fran● Traballo en OpenHost e na OSL da USC
● Desenvolvedor web de aplicativos con altas taxas de usuarios
● Traballei durante 3 anos con Ruby on Rails
● Agora mesmo estou traballando nunha plataforma editorial dixital para periódicos desenvolvida con PHP (Zend, Smarty, Doctrine)
● Membro de GNOME pola GNOME Foundation
● Contacto
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
4
Que imos ver
● Que fai lento o meu aplicativo!!
● Consideracións que poucos saben e como atallalas
● Sistemas de plantillas: Smarty 3 (non 2)
● Sistemas de cache
● Apps na nube: Clustering, balanceo, CDN, ...
ttEste traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
5
Que fai lento o meu aplicativo
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
6
Bottlenecks: os inimigos
● Sistemas de ficheiros
● Conexións simultáneas
● Xestión de memoria do sistema● Servidores de app vs servidores de apps
● Conexión a outros servidores
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
7
Sistemas de ficheiros● Se usades Linux nos vosos servers tedes que
ter en conta as restricións dos FS:
● Sempre son problemas derivados do sistema de xestión de nodos-i
● Normalmente os sistemas de ficheiros funcionan ben até os 1024 elementos dentro dun mesmo nodo-i
● Polo que sempre tentade que dentro dun cartafol haxa como máximo 1024 elementos
● Se vos pasades empregade aniñado de cartafoles
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
8
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
9
Problema de conexiónssimultáneas● Configuración de Apache
● Se temos poucas conexións (usuarios concurrentes) o noso script PHP usará menos memoria compartida
● Pero se temos moitas conexións simultáneas PHP non xestiona nada ben a memoria compartida e pode ocasionar perdas de rendemento incríbeis
● SOLUCIÓN:
● Usar sistemas de memoria compartida externa
● Cachear a estáticos ou OpCode
● Utilizar métodos de abstracción para usar servizos de terceiros
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
10
Como simulamos altas taxas deusuarios?
● Hai moitas ferramentas
● Httperf de HP, un manual moi chulo● Ab do Proxecto Apache● ...
● PROBLEMA:
● Non representan de forma fidedigna as accións de usuarios (useflow completo do usuario)
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
11
Servidores de aplicativo vsservidores de estáticos● É moi importante ter ben diferenciados os
servidores que serven ficheiros logo dun procesado (aplicativo) dos que son servidores de estáticos
● Eu recomendo que estean en distintas máquinas cando o proxecto creza dabondo
● Podedes empregar o que queirades pero:
● Apache: como server de aplicacións co módulo mod_php
● Nginx: como server de estáticos
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
12
Coding Standards
● Batalla de mínimos (pero que suman)
● Non teñen relación directa co rendemento da app.
● Pero fallos pequenos incrementan as chamadas internas do parser de PHP
● Incrementa chamadas a error handlers.
● Exemplo:
● Eliminando os ?> dos controladores e modelos obrigas a PHP a non pechar os streams de código o cal implica un incremento de rendemento dun 0,4 % do script final.
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
13
Máis exemplos en PHP● Uso das funcións de expresións regulares de Perl
● Preg_replace, Preg_match● Etc.
● Uso de include vs require (*once)
● Outro exemplo chorra:
● Impresión de texto con:– Print e non echo
– Usade a nomenclatura “{$nome_do_usuario}” e non “$nome_do_usuario”
● O mito de que o uso de Orientación a obxectos é máis lento xa non se cumpre
– A partires de PHP 5.3 isto mellorou moitísimo, e PHP 5.4 promete un 35% de ganancia de rendemento
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
14
Standard Public Library
● Se queredes facer que PHP vaia máis rápido
● POR FAVOR USADE O SPL DE PHP● Son APIs escritas en C e compiladas en lingua máquina polo que
vai ir moi rápido
● Ten API para moitas das tarefas comúns cando queremos acceder a elementos do sistema a baixo nivel:
● Parseo de XML optimizado● Iteradores de Obxectos, Arrays, Ficheiros, Directorios● Sistema de excepcións máis extenso que o incluído no core.
● Vantaxe: todo orientado a obxectos
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
15
Usade proffiling
● O proffiling é analizar as chamadas internas da linguaxe e o uso de memoria e tempos de execución de cada unha delas
● Para PHP usade Xdebug (basicamente porque non hai outro)
● Permite proffiling e debugging de forma moi cómoda
● Para consultar os resultados empregade Kcachegrind ou webgrind.
● Se sabedes interpretar de forma correcta os resultados podedes
● saber onde están os bottlenecks nos vosos apps.
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
16
En resumo, atallamos así
● Estáticos en servers distintos aos de app
● Gardando todo o preciso en memoria compartida
● Crear estáticos● Balancear carga entre varios servers
● Sistemas cache distribuídas● Ter en conta o problema de conexións
simultáneas
ttEste traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
17
Caché e Sistemas de caché
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
18
Tipos de caché
● Principalmente categorízanse en:
● Caché de páxina● Caché de fragmentos● Caché de accións
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
19
Sistemas de caché
● Hai dous tipos:
● Sistemas de caché interna● Sistemas de caché externa
● Para cada un salientamos
● Interna: APC● Externa: Memcache
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
20
Sistemas de caché e II
● O realmente interesante é ter unha infraestrutura escalonada de sistema de Cache
● Zend Framework fornece un sistema de varias capas onde podes aniñar distintos sistemas de caché segundo a súa velocidade: Zend_Cache– APC– Memcache
● Base de datos● Cache de sistema de ficheiros● Personalizadas
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
21
APC (Alternative PHP Cache)
● A partir de PHP 5.4 seráincluído no paquete base de PHP polo que podedes empregalo sen instalación algunha
● Para todo lo demás:
● usade pecl ou paquetería do voso SO.
● Api moi sinxela:
● apc_add()● apc_exists()● apc_fetch()
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
22
Memcache● Agnóstico á lingua de programación
● Sistema totalmente distribuído
● Permite multiserver e multiclientes
● Permite ter un banco de memoria (pares chave-valor) do tamaño que queirades, nunha máquina externa que comparte recursos a varios servers
● Api moi sinxela:
● Memcache::connect, conexión inicial ao porto 11211● Memcache::set● Memcache::get
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
23
Sistemas de plantillas
● Hai moita controversia co sistema de plantillas
● Moitas persoas prefiren empregar PHP misturado con HTML
● Outras moitas empregan un sistema de plantillas● Todo depende das vosas necesidades porén eu
prefiro empregar un sistema de plantillas
● Vantaxes: sistemas de caching e compilación a opcode das plantillas, etc, etc, etc
● Desvantaxes: obrigan a aprender unha nova sintaxe e distintas API.
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
24
Smarty 3
● Para min e a unha solución definitiva en PHP
● Olvidádevos de Smarty 2 (cousa do pasado, 6 meses)
● Características:
● Sistema de cache por grupos● Compilación a OpCode● Compilación a PHP optimizado● Totalmente extensíbel● Facilita a reutilización de partials● Template inheritance● Sistema bastante bo de plugins (non orientado a obxectos!!!)
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
25
Smarty 3
● Baixo as miñas probas
● Incremento de rendemento do 30% fronte a Smarty 2
● Incremento de rendemento do 15% fronte a uso de PHP embembed
– Logo de que Smarty compile as vistas a PHP
● Incremento de rendemento do 40% fronte a uso de PHP Embembed
– Logo que Smarty compile as vistas a OpCode
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
26
Caché, caché, caché
● Para o caso das plantillas con partes dinámicas
● Tentade compilar a OpCode con servers especializados como Zend Server (aviso $$$)
● Para o caso de plantillas estáticas
● Tipico: Hola {$nome_do_usuario}● Compilade todo a html estático escribindo en
filesystem ou memcache● Incluso podedes empregar este sistema para
cachear fragmentos (partials)
ttEste traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
27
Clustering e apps na nube
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
28
Clustering e apps na nube
● Ao final todo se reduce a:
● Externalizar recursos● Especializar servers por uso dos mesmos
– Estáticos– Memoria compartida– Sesións– Execución do app– Load balancers e proxies inversos
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
29
Sistemas de clustering
● Sodes desenvolvedores, non perdades tempo en administración de sistemas
● O mellor é empregar sistemas que poidan autoescalar
● Eu recomendo EC2 combinado con S3 de Amazon● E se o presuposto o permite empregade Akamai.
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
30
Apps na nube
● Como fago que o meu App poida empregar clustering ou poida correr na nube?
● Realmente non cambia moito da infraestrutura que tes sempre que empregues as anteriores suxestións
● O IMPORTANTE É EXTERNALIZAR RECURSOS
● Caches distribuídas● Conversión a estáticos e Opcode● Diferencia de servidores de aplicativos vs servidores de
estáticos
ttEste traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
31
Preguntas