Como facer PHP fodidamente rápido

30
Como facer PHP fodidamente rápido Fran Diéguez – OpenHost && Mabishu

Transcript of Como facer PHP fodidamente rápido

Page 1: Como facer PHP fodidamente rápido

Como facer PHP fodidamente rápido

Fran Diéguez – OpenHost && Mabishu

Page 2: Como facer PHP fodidamente rápido

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

Page 3: Como facer PHP fodidamente rápido

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)

Page 4: Como facer PHP fodidamente rápido

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

Page 5: Como facer PHP fodidamente rápido

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

Page 6: Como facer PHP fodidamente rápido

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

Page 7: Como facer PHP fodidamente rápido

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.

Page 8: Como facer PHP fodidamente rápido

Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h

8

Page 9: Como facer PHP fodidamente rápido

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

Page 10: Como facer PHP fodidamente rápido

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)

Page 11: Como facer PHP fodidamente rápido

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

Page 12: Como facer PHP fodidamente rápido

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.

Page 13: Como facer PHP fodidamente rápido

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

Page 14: Como facer PHP fodidamente rápido

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

Page 15: Como facer PHP fodidamente rápido

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.

Page 16: Como facer PHP fodidamente rápido

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

Page 17: Como facer PHP fodidamente rápido

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é

Page 18: Como facer PHP fodidamente rápido

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

Page 19: Como facer PHP fodidamente rápido

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

Page 20: Como facer PHP fodidamente rápido

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()

Page 21: Como facer PHP fodidamente rápido

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

Page 22: Como facer PHP fodidamente rápido

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

Page 23: Como facer PHP fodidamente rápido

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.

Page 24: Como facer PHP fodidamente rápido

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

Page 25: Como facer PHP fodidamente rápido

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!!!)

Page 26: Como facer PHP fodidamente rápido

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)

Page 27: Como facer PHP fodidamente rápido

Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h

27

Clustering

Page 28: Como facer PHP fodidamente rápido

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.

Page 29: Como facer PHP fodidamente rápido

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

Page 30: Como facer PHP fodidamente rápido

Este traballo ten a licenza Creative Commons Atribución 3.0.Para ver unha copia da licenza visite http://tinyurl.com/2v352h

30

Preguntas