Como facer PHP fodidamente rápido
-
Upload
fran-dieguez -
Category
Documents
-
view
583 -
download
5
Transcript of Como facer PHP fodidamente rápido
Como facer PHP fodidamente rápido
Fran Diéguez – OpenHost && Mabishu
Este 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
Fran Diéguez
● 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)
● Estou perxudicado (as festas pérdenme)
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?
● Consideracións que poucos saben e como atallalas
● Sistemas de cache
● Sistemas de plantillas: Smarty 3 (non 2)
● Clustering
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
5
Consideracións que poucos sabene como atallalas
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
6
Principais lugares de bottlenecks
● Sistemas de ficheiros
● Conexións simultáneas
● Memoria compartida
● Xestión de procesos do sistema
● 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 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óns simultáneas● Se temos poucas conexións
(usuarios concurrentes) o noso script PHP usará menos memoria compartida
● 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 de usuarios?
● Hai moitas ferramentas
● Ab do Proxecto Apache● Httperf de HP, un manual moi chulo● ...
● 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 vs servidores 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
● Non teñen relación directa co rendemento da app
● Pero fallos pequenos poden incrementar as chamadas internas do parser de PHP
● 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
● 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
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:
● Iteradores de Obxectos, Arrays, Ficheiros, Directorios● Parseo de XML optimizado● 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 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, atacamos así
● Gardando todo en memoria compartida
● Crear estáticos
● Balancear carga entre varios servers
● Sistemas cache distribuídas● Problema de conexións simultáneas
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
17
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
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
19
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
20
APC (Alternative PHP Caché)
● 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
● Api moi sinxela:
● apc_exists()● apc_add()● apc_fetch()
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
21
Memcache
● Agnóstico á lingua de programación
● Sistema totalmente distribuído
● Permite ter un banco de memoria (pares chave-valor) do tamaño que queirades nunha máquina externa que comparte recursos a varios servers
● Permite multiserver e multiclientes
● 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
22
Sistemas de plantillas
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
● 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
25
Smarty 3 características
● Olvidádevos de Smarty 2 (cousa do pasado, 3 meses)
● Características:
● Template inheritance● Sistema de cache por grupos● Compilación a OpCode● Compilación a PHP optimizado● Totalmente extensíbel● Facilita a reutilización de partials● 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
26
Caché, caché, caché
● Para o caso das plantillas con partes dinámicas
● Tipico: Hola {$nome_do_usuario}● Tentade compilar a OpCode con servers
especializados como Zend Server (aviso $$$)● Para o caso de plantillas estáticas
● Compilade todo a html estático escribindo en filesystem ou memcache
● Incluso podedes empregar este sistema para cachear fragmentos (partials)
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
27
Clustering
Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h
28
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
29
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– Caches distribuídas– Conversión a estáticos e Opcode– Diferencia de servidores de aplicativos
vs servidores 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
30
Preguntas