Otimizacao de websites em PHP

80
OTIMIZANDO A PERFORMANCE DE WEBSITES EM PHP

description

Slides do workshop apresentado por mim, Felipe Ribeiro, na PHPConference 2009

Transcript of Otimizacao de websites em PHP

Page 1: Otimizacao de websites em PHP

OTIMIZANDO A PERFORMANCE DE WEBSITES

EM PHP

Page 2: Otimizacao de websites em PHP

FELIPE RIBEIRO

• Graduando (concluinte) em Ciência da Computação na UFCG

• Zend Certified Engineer - PHP5

• Trabalha como desenvolvedor Web e consultor com foco em performance e escalabilidade de Websites

• Experiência em grids computacionais e sistemas distribuídos

• Membro fundador do grupo PHP-PB

• Contribuidor do PHP e Mozilla Camino

Page 3: Otimizacao de websites em PHP

OBJETIVO

• O objetivo desse mini-curso é apresentar alguns dos conceitos utilizados na otimização da performance e escalabilidade de web sites

• A abordagem utilizada será bottom-up, ou seja, iniciaremos de ajustes no servidor e back-end, para depois ajustarmos o front-end

• Em aplicações práticas, essa abordagem depende do problema.

• Quem está “sofrendo” mais? Servidor ou cliente?

Page 4: Otimizacao de websites em PHP

Performance

a habilidade que uma aplicação tem de atingir um objetivo, como por exemplo responder no menor tempo possível

Page 5: Otimizacao de websites em PHP

Escalabilidade

a habilidade de uma aplicação manter a performance quando a carga de trabalho aumenta.

Page 6: Otimizacao de websites em PHP

PHP não é tão rápido...

Page 7: Otimizacao de websites em PHP

Porém sua arquitetura shared-nothing simplifica a

escalabilidade

Page 8: Otimizacao de websites em PHP

E PHP dificilmente é o gargalo

Page 9: Otimizacao de websites em PHP

A maior parte do tempo é gasto no

banco de dados ou com o carregamento

do front-end

Page 10: Otimizacao de websites em PHP

Sempre dá para espremer e melhorar

Page 11: Otimizacao de websites em PHP

“OTIMIZAÇÃO PREMATURA É A RAÍZ DE TODOS OS PROBLEMAS”

DONALD KNUTH

Page 12: Otimizacao de websites em PHP

É preciso medir antes de “adivinhar”

o que otimizar

Page 13: Otimizacao de websites em PHP

É preciso medir antes de “adivinhar”

o que otimizar

E como medir?

Page 14: Otimizacao de websites em PHP

Na medição, duas perguntas precisam

ser respondidas

Page 15: Otimizacao de websites em PHP

1 - Quão rápido é meu sistema?

Page 16: Otimizacao de websites em PHP

1 - Quão rápido é meu sistema?

Em aplicações Web, a métrica mais comum é o reqs/sec

Page 17: Otimizacao de websites em PHP

1 - Quão rápido é meu sistema?

Essa pergunta é respondida com benchmarks

Page 18: Otimizacao de websites em PHP

Testes de carga

Page 19: Otimizacao de websites em PHP

Testes de carga

ApacheBench (ab)

Siege - www.joedog.org

Page 20: Otimizacao de websites em PHP

Macintosh:~ felipe$ ab -c 10 -t 30 -k 'http://shoprizer.localhost/'This is ApacheBench, Version 2.3 <$Revision: 655654 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking shoprizer.localhost (be patient)Finished 4379 requests

Server Software: Apache/2.0.59Server Hostname: shoprizer.localhostServer Port: 80

Document Path: /Document Length: 22320 bytes

Concurrency Level: 10Time taken for tests: 30.010 secondsComplete requests: 4379Failed requests: 0Write errors: 0Total transferred: 99436344 bytesHTML transferred: 97806240 bytesRequests per second: 145.92 [#/sec] (mean)Time per request: 68.532 [ms] (mean)Time per request: 6.853 [ms] (mean, across all concurrent requests)Transfer rate: 3235.74 [Kbytes/sec] received

Page 21: Otimizacao de websites em PHP

Macintosh:~ felipe$ siege -b -t30s 'http://shoprizer.localhost/'** SIEGE 2.67** Preparing 10 concurrent users for battle.The server is now under siege...Lifting the server siege... done.Transactions: 4909 hitsAvailability: 100.00 %Elapsed time: 29.84 secsData transferred: 104.49 MBResponse time: 0.06 secsTransaction rate: 164.51 trans/secThroughput: 3.50 MB/secConcurrency: 9.93Successful transactions: 4909Failed transactions: 0Longest transaction: 2.28Shortest transaction: 0.00

Page 22: Otimizacao de websites em PHP

2 - Por que meu sistema tem essa performance?

Page 23: Otimizacao de websites em PHP

Profiling

2 - Por que meu sistema tem essa performance?

Page 24: Otimizacao de websites em PHP

Xdebug arrebenta no profiling!

Page 25: Otimizacao de websites em PHP

• Instale a extensão Xdebug

• Habilite a opção xdebug.profiler_enable caso queira que toda execução gere o log

• Ou a opção xdebug.profiler_enable_trigger para que o log só seja gerado quando você passar?XDEBUG_PROFILE na URL

Page 26: Otimizacao de websites em PHP

• Rode o script que você quer analisar

• Abra o log gerado pelo Xdebug no KCacheGrind caso use Linux, ou no WebGrind em qualquer outra plataforma.

Page 29: Otimizacao de websites em PHP

• xdebug_memory_usage( ) diz quanto de memória o script está usando no momento da chamada

• xdebug_peak_memory_usage( ) diz qual o valor máximo de memória que foi usada durante a execução

Page 30: Otimizacao de websites em PHP

Ajustes nos servidores

Page 31: Otimizacao de websites em PHP

APACHE

Page 32: Otimizacao de websites em PHP

MOD_DEFLATE

• Comprime o arquivo com gzip antes de enviar (se o navegador suportar)

• O custo de processamento normalmente é compensado com a economia de banda

• Só compacte arquivos de texto (html, xml, css, js)

Page 33: Otimizacao de websites em PHP

MOD_DEFLATE

• Configurando:

$ a2enmod deflate

/etc/apache2/mods-available/deflate.conf<IfModule mod_deflate.c>AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript</IfModule>

Page 34: Otimizacao de websites em PHP

MOD_EXPIRES

• Diga ao visitante até quando ele pode usar a versão atual de um arquivo sem precisar acessar o servidor novamente

• Use o cache do cliente, economize requisições e dê a ele a impressão de mais rapidez

• mod_expires coloca no cabeçalho HTTP a data de expiração daquele arquivo

Page 35: Otimizacao de websites em PHP

MOD_EXPIRES

$ a2enmod expires

No seu .htaccess ou configuração do site:

ExpiresActive OnExpiresDefault "access plus 30 days" ExpiresByType text/html "access plus 1 month 15 days 2 hours"ExpiresByType image/gif "modification plus 5 hours 3 minutes"

Page 36: Otimizacao de websites em PHP

DIRECTORYINDEX

• No Apache você pode configurar o DirectoryIndex que especifica qual arquivo é o “index” de cada diretório

• Você pode especificar mais de um e o Apache segue a sequência até achar o que exista:

<Directory /var/www>    DirectoryIndex index.html index.htm index.php</Directory>• Para isso, é feita uma syscall para verificar a existência dos arquivos

a cada requisição

Page 37: Otimizacao de websites em PHP

DIRECTORYINDEX

• O impacto é pequeno mas podemos evitar isso

• Configure o DirectoryIndex para ir direto para o arquivo correto

<Directory /var/www>    DirectoryIndex index.php</Directory>

Page 38: Otimizacao de websites em PHP

Use um servidor a parte para arquivos estáticos

http://static.example.com

Page 39: Otimizacao de websites em PHP

Algo mais leve também resolve...

Lighttpdnginxthttpd

Page 40: Otimizacao de websites em PHP

PHP

Page 41: Otimizacao de websites em PHP

APC

• PHP compila os arquivos (JIT) e gera um código intermediário (opcode) a cada execução

• Essa compilação pode ser evitada, para isso é necessário fazer cache do opcode

• A solução padrão é o APC

• Virá “built-in” no PHP6

Page 42: Otimizacao de websites em PHP

APC

• Existem outras alternativas com o mesmo propósito

• XCache

• Zend Platform

Page 43: Otimizacao de websites em PHP

APC

• A instalação é trivial, no Ubuntu basta executar :

# apt-get install php-apc

• Por padrão o cache do opcode já é habilitado

• O parâmetro apc.stat permite que o APC não cheque se o arquivo foi alterado (aumentando ainda mais a performance), o que é bom para sistemas em produção. Mas qualquer alteração implica num restart do Apache.

Page 44: Otimizacao de websites em PHP

BANCOS DE DADOS

MySQL

Page 45: Otimizacao de websites em PHP

MYSQL• MySQL é o SGBD mais comumente utilizado com o PHP

• Foi feito com foco em performance, mas com o tempo vem ganhando funcionalidades voltadas para integridade relacional e consistência dos dados

• Implementa um cache interno de queries

• Os principais engines são:

• MyISAM

• InnoDB

• Ambos usam índices organizados internamente em árvores B

• Qual escolher?

Page 46: Otimizacao de websites em PHP

MYSQL - MYISAM

• Rápida para leitura

• Table-level locking

• Uma escrita trava todos os acessos paralelos à tabela

• INSERT DELAYED é não bloqueante e permite que seu PHP continue executando enquanto a query fica na fila para ser executada

• Índices FullText

Page 47: Otimizacao de websites em PHP

MYSQL - MYISAM

• Menor consumo de memória e espaço em disco

• Utiliza recursos de cache do sistema operacional

Page 48: Otimizacao de websites em PHP

MYSQL - INNODB

• Integridade relacional

• Chaves estrangeiras

• Row-level locking

• Na escrita, só é travado para acessos paralelos o registro que está sendo escrito

• Maior consumo de memória e espaço em disco

• Utiliza implementação própria de cache

Page 49: Otimizacao de websites em PHP

ÍNDICES

Page 50: Otimizacao de websites em PHP

ÍNDICES

• Índices agilizam as buscas e tornam as escritas mais lentas

• Transforme em índice todas as colunas que são utilizadas como parâmetro de consulta ou ordenação

• Remova o índice das colunas que não são utilizadas nessas situações.

Page 51: Otimizacao de websites em PHP

TIPOS DE DADOS

Page 52: Otimizacao de websites em PHP

TIPOS DE DADOS

• Não armazene números em VARCHAR

• Não armazene datas em VARCHAR

• Se o campo tem tamanho fixo use CHAR

• Ex.: Uma senha em MD5 (32) ou SHA1 (41)

• Economiza espaço e facilita as comparações

Page 53: Otimizacao de websites em PHP

CACHE

Page 54: Otimizacao de websites em PHP

CACHE

• Cache é a solução mais comum para otimização de performance em diversas áreas da computação

• Consiste em armazenar uma informação que é mais acessada num meio mais rápido do que a sua real origem.

• Por exemplo: Memória RAM serve de cache para o disco

Page 55: Otimizacao de websites em PHP

CACHE

• Consulta a dados que não se alteram com muita frequência podem ser colocadas em cache. Por exemplo:

• Um site de notícias não precisa acessar o banco todas as vezes que uma mesma notícia precisa ser exibida.

• Um site que agrega conteúdo de vários outros não precisa consultar as APIs a cada acesso dos seus usuários. Ele pode manter um cache local.

Page 56: Otimizacao de websites em PHP

CACHE

• Iremos discutir a implementação de 4 tipos de cache:

• Smarty (Cache em disco)

• APC (Cache em memória)

• Memcache (Cache em memória em ambiente distribuído)

• Funky Caching (Cache em disco com a criação de arquivos estáticos)

Page 57: Otimizacao de websites em PHP

SMARTY

• Smarty é uma biblioteca muito popular de “template engine”

• Porém ela também oferece a funcionalidade de cache dos templates já com as informações agregadas

• Gerando no disco um arquivo específico para cada registro “cacheado”

• Você pode setar um TTL para o objeto em cache

Page 58: Otimizacao de websites em PHP

SMARTY

<?phprequire 'smarty/Smarty.class.php';

$id = (int) $_GET['id'];$smarty = new Smarty();$smarty->caching = 1;

if(!$smarty->is_cached('noticia.tpl',$id)) { //Carrega do banco de dados}$smarty->display('noticia.tpl',$id);

http://smarty.net/manual/pt_BR/caching.php

Page 59: Otimizacao de websites em PHP

APC

• O mesmo APC que faz cache do Opcode também faz cache de objetos na memória

• apc.shm_size determina quanto de memória o APC pode usar para armazenar objetos, quando esse espaço é ocupado, os que foram usados a mais tempo são removidos (LRU)

• Você pode setar um TTL para o objeto em cache

Page 60: Otimizacao de websites em PHP

APC

<?php$id = (int) $_GET['id'];$cache_id = "noticia::$id";

if(!($noticia = apc_fetch($cache_id))) {

$noticia = new Noticia($id);

//Armazena o valor no cache em memória do APC apc_store($cache_id, $noticia);}

...

http://br.php.net/apc

Page 61: Otimizacao de websites em PHP

MEMCACHE

• O Memcache independe do PHP, é executado como um daemon externo

• Conecta-se via sockets, e por isso não é indicado para grandes objetos

• Utiliza também a política do LRU para remoção

• Você pode setar um TTL para o objeto em cache

Page 62: Otimizacao de websites em PHP

MEMCACHE<?php$id = (int) $_GET['id'];$cache_id = "noticia::$id";

$memcache = new Memcache();$memcache->connect('localhost', 11211);

if(!($noticia = $memcache->get($cache_id))) { $noticia = new Noticia($id); $memcache->set($cache_id,$noticia);}

...

http://br.php.net/memcache

Page 63: Otimizacao de websites em PHP

MEMCACHE

• Memcache também pode ser utilizado como mecanismo para armazenamento de dados de sessão.

• Isso permite que se tenha vários servidores Web e independente de qual servidor trate a requisição do usuário, pode-se acessar os dados de sessão que estão no servidor Memcache, basta setar no php.ini:

session.save_handler = memcachesession.save_path = "tcp://host_do_memcache:11211"

Page 64: Otimizacao de websites em PHP

FUNKY CACHING

• Funky Caching é uma técnica não muito elegante mais muito eficiente

• Consiste em criar arquivos html estáticos sob demanda

• Usada no próprio site php.net

Page 65: Otimizacao de websites em PHP

FUNKY CACHING

• No .htaccess ou outro arquivo de configuração do seu site no Apache, especifique como página de erro 404 um script PHP que é responsável por criar as páginas que não estão em cache.

• Por exemplo, no diretório http://www.example.com/noticias/ poderíamos criar um .htacces com a regra:

ErrorDocument 404 /noticias/gera_cache.php

Page 66: Otimizacao de websites em PHP

FUNKY CACHING

• No gera_noticias.php faríamos tratamento da URL que foi requisitada e criaríamos o arquivo caso seja possível, por exemplo:

• http://www.example.com/noticias/1234.html indica que o usuário quer acessar a notícia de id 1234

• O PHP cria esse arquivo e nos próximos acessos o html existirá e o PHP não será mais chamado, pois não ocorrerá o erro 404.

Page 67: Otimizacao de websites em PHP

FUNKY CACHING<?php$id = basename($_SERVER['REDIRECT_URL'], '.html');

/* Acessa a página dinâmica */$html = file_get_contents(sprintf("http://www.example.com/noticias.php?id=%d",$id));/* O ideal é fazer algum tratamento de erros, para evitar acriação de arquivos para ids inválidos */

/* Exibe o conteúdo */header(sprintf('%s 200', $_SERVER['SERVER_PROTOCOL']));echo $html;

/* Salva o conteúdo em um arquivo .html */file_put_contents(sprintf(dirname(__FILE__)."/%d.html", $id), $html);

Page 68: Otimizacao de websites em PHP

E A NÍVEL DE BROWSER?

Page 69: Otimizacao de websites em PHP

FIREBUG + YSLOW

• São plugins para o Mozilla Firefox

• Fazem análise para depuração (Firebug) e otimização (YSlow) de toda a parte client-side

• YSlow foi desenvolvido pelo Yahoo Performance Team

Page 70: Otimizacao de websites em PHP

FIREBUG - NETMostra o tempo de requisição, espera e download de cada

componente da página

Page 71: Otimizacao de websites em PHP

FIREBUG - NET

Page 72: Otimizacao de websites em PHP

YSLOW - GRADEAnalisa vários critérios da página, dá “notas” e dá dicas de como

melhorar

Page 73: Otimizacao de websites em PHP

YSLOW - GRADE

Page 74: Otimizacao de websites em PHP

YSLOW - COMPONENTSPermite analisar a carga de cada componente carregado

Page 75: Otimizacao de websites em PHP

YSLOW - COMPONENTS

Page 76: Otimizacao de websites em PHP

YSLOW - STATISTICSMostra como a carga está proporcionalmente dividida entre os

componentes da página, com cache limpo e “quente”

Page 77: Otimizacao de websites em PHP

YSLOW - STATISTICS

Page 78: Otimizacao de websites em PHP

YSLOW - TOOLSFerramentas para compressão de Javascript, imagens, geração de

relatórios e análise de código

Page 79: Otimizacao de websites em PHP

YSLOW - TOOLS

Page 80: Otimizacao de websites em PHP

REFERÊNCIAS

• PHP - Simple is Hard - Rasmus Lerdorf - http://talks.php.net/show/w2e09

• Alta performance em Web Sites - Souders - Editora O’Reilly