1. Como facer PHP
fodidamente rápido
Fran Diéguez – OpenHost && Mabishu
2. Sobre min
Este traballo ten a licenza Creative Commons Atribución 3.0.
2 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.
3 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.
4 Para ver unha copia da licenza visite http://tinyurl.com/2v352h
5. Consideracións que poucos saben
e como atallalas
Este traballo ten a licenza Creative Commons Atribución 3.0.
5 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.
6 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.
7 Para ver unha copia da licenza visite http://tinyurl.com/2v352h
8. Este traballo ten a licenza Creative Commons Atribución 3.0.
8 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.
9 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.
10 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.
11 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.
12 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.
13 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.
14 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.
15 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.
16 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.
17 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.
18 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.
19 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.
20 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.
21 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.
22 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.
23 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.
24 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.
25 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.
26 Para ver unha copia da licenza visite http://tinyurl.com/2v352h
27. Clustering
Este traballo ten a licenza Creative Commons Atribución 3.0.
27 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.
28 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.
29 Para ver unha copia da licenza visite http://tinyurl.com/2v352h
30. Preguntas
Este traballo ten a licenza Creative Commons Atribución 3.0.
30 Para ver unha copia da licenza visite http://tinyurl.com/2v352h