OTIMIZANDO A
PERFORMANCE DE WEBSITES
        EM PHP
FELIPE RIBEIRO
• Graduando     (concluinte) em Ciência da Computação na UFCG

• Zend   Certified Engineer - PHP5

• Trabalh...
OBJETIVO

•O  objetivo desse mini-curso é apresentar alguns dos conceitos
utilizados na otimização da performance e escala...
Performance

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

a habilidade de uma aplicação
manter a performance quando
a carga de trabalho aumenta.
PHP não
é tão
rápido...
Porém sua
arquitetura shared-
nothing simplifica a
     escalabilidade
E PHP
dificilmente
é o gargalo
A maior parte do
  tempo é gasto no
 banco de dados ou
com o carregamento
       do front-end
Sempre dá para
espremer e melhorar
“OTIMIZAÇÃO PREMATURA É A
RAÍZ DE TODOS OS PROBLEMAS”
                DONALD KNUTH
É preciso medir
antes de “adivinhar”
      o que otimizar
É preciso medir
   antes de “adivinhar”
         o que otimizar




E como medir?
Na medição, duas
perguntas precisam
   ser respondidas
1 - Quão rápido
é meu sistema?
1 - Quão rápido
      é meu sistema?
Em aplicações
Web, a métrica
mais comum é o
reqs/sec
1 - Quão rápido
é meu sistema?


Essa pergunta é
respondida com
benchmarks
Testes
de carga
Testes
de carga

ApacheBench (ab)
Siege - www.joedog.org
Macintosh:~ felipe$ ab -c 10 -t 30 -k 'http://shoprizer.localhost/'
This is ApacheBench, Version 2.3 <$Revision: 655654 $>...
Macintosh:~ felipe$ siege -b -t30s 'http://shoprizer.localhost/'
** SIEGE 2.67
** Preparing 10 concurrent users for battle...
2 - Por que meu
sistema tem essa
performance?
2 - Por que meu
sistema tem essa
performance?



              Profiling
Xdebug
arrebenta no
profiling!
• Instale   a extensão Xdebug

        a opção xdebug.profiler_enable
• Habilite
 caso queira que toda execução gere o log
...
• Rode   o script que você quer analisar

• Abra
     o log gerado pelo Xdebug no
 KCacheGrind caso use Linux, ou no
 WebG...
KCacheGrind
http://code.google.com/p/webgrind/
• xdebug_memory_usage(   ) diz quanto de
 memória o script está usando no momento
 da chamada

• xdebug_peak_memory_usage(...
Ajustes nos servidores
APACHE
MOD_DEFLATE


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

•O custo de processamento norm...
MOD_DEFLATE

• Configurando:

 $ a2enmod deflate

 /etc/apache2/mods-available/deflate.conf
<IfModule mod_deflate.c>
AddOut...
MOD_EXPIRES

• Digaao visitante até quando ele pode usar a versão atual de um
 arquivo sem precisar acessar o servidor nov...
MOD_EXPIRES

 $ a2enmod expires

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

ExpiresActive On
ExpiresDefault "access plus ...
DIRECTORYINDEX

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


•O   impacto é pequeno mas podemos evitar isso

• Configure   o DirectoryIndex para ir direto para o arqui...
Use um servidor a
 parte para
 arquivos estáticos

http://static.example.com
Algo mais leve
    também resolve...


Lighttpd
nginx
thttpd
PHP
APC

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

• Essa
     compilação pode ...
APC


• Existem   outras alternativas com o mesmo propósito

  • XCache

  • Zend    Platform
APC

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

 # apt-get install php-apc

• Por   padrão o cache do opcode já...
BANCOS DE
  DADOS
   MySQL
MYSQL
• MySQL     é o SGBD mais comumente utilizado com o PHP
• Foi
    feito com foco em performance, mas com o tempo vem...
MYSQL - MYISAM

• Rápida    para leitura

• Table-level   locking

  • Uma     escrita trava todos os acessos paralelos à ...
MYSQL - MYISAM



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

• Utiliza   recursos de cache do sistema operacional
MYSQL - INNODB

• Integridade   relacional

  • Chaves     estrangeiras

• Row-level    locking

  • Na  escrita, só é tra...
ÍNDICES
ÍNDICES


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

• Transformeem índice todas as colunas que são ...
TIPOS DE
 DADOS
TIPOS DE DADOS

• Não   armazene números em VARCHAR

• Não   armazene datas em VARCHAR

• Se   o campo tem tamanho fixo use...
CACHE
CACHE


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

• Consiste
        ...
CACHE

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

  ...
CACHE

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

  • Smarty   (Cache em disco)

  • APC    (Cache em memór...
SMARTY

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

• Porém ela também oferece a funcionalidade de cac...
SMARTY
   http://smarty.net/manual/pt_BR/caching.php

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

$id = (int) $_GET['id'];
$...
APC

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

• apc.shm_size   determina quanto de me...
APC
                  http://br.php.net/apc
<?php
$id = (int) $_GET['id'];
$cache_id = "noticia::$id";

if(!($noticia = ap...
MEMCACHE

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

• Conecta-se    via sockets, e por isso não é...
MEMCACHE
          http://br.php.net/memcache
<?php
$id = (int) $_GET['id'];
$cache_id = "noticia::$id";

$memcache = new ...
MEMCACHE

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

• Isso
     permite ...
FUNKY CACHING


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

• Consiste   em criar arquivos html ...
FUNKY CACHING

• No .htaccess ou outro arquivo de configuração do seu site no
 Apache, especifique como página de erro 404 u...
FUNKY CACHING

• No gera_noticias.php faríamos tratamento da URL que foi
 requisitada e criaríamos o arquivo caso seja pos...
FUNKY CACHING
<?php
$id = basename($_SERVER['REDIRECT_URL'], '.html');

/* Acessa a página dinâmica */
$html = file_get_co...
E A NÍVEL DE BROWSER?
FIREBUG + YSLOW


• São   plugins para o Mozilla Firefox

• Fazem análise para depuração (Firebug) e otimização (YSlow) de...
FIREBUG - NET
Mostra o tempo de requisição, espera e download de cada
                componente da página
FIREBUG - NET
YSLOW - GRADE
Analisa vários critérios da página, dá “notas” e dá dicas de como
                             melhorar
YSLOW - GRADE
YSLOW - COMPONENTS
Permite analisar a carga de cada componente carregado
YSLOW - COMPONENTS
YSLOW - STATISTICS
Mostra como a carga está proporcionalmente dividida entre os
    componentes da página, com cache limpo...
YSLOW - STATISTICS
YSLOW - TOOLS
Ferramentas para compressão de Javascript, imagens, geração de
                relatórios e análise de código
YSLOW - TOOLS
REFERÊNCIAS



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

• Alta   performance em Web Sit...
Upcoming SlideShare
Loading in...5
×

Otimizacao de websites em PHP

6,114

Published on

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

Published in: Technology
3 Comments
15 Likes
Statistics
Notes
No Downloads
Views
Total Views
6,114
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
216
Comments
3
Likes
15
Embeds 0
No embeds

No notes for slide
  • Otimizacao de websites em PHP

    1. 1. OTIMIZANDO A PERFORMANCE DE WEBSITES EM PHP
    2. 2. 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
    3. 3. 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?
    4. 4. Performance a habilidade que uma aplicação tem de atingir um objetivo, como por exemplo responder no menor tempo possível
    5. 5. Escalabilidade a habilidade de uma aplicação manter a performance quando a carga de trabalho aumenta.
    6. 6. PHP não é tão rápido...
    7. 7. Porém sua arquitetura shared- nothing simplifica a escalabilidade
    8. 8. E PHP dificilmente é o gargalo
    9. 9. A maior parte do tempo é gasto no banco de dados ou com o carregamento do front-end
    10. 10. Sempre dá para espremer e melhorar
    11. 11. “OTIMIZAÇÃO PREMATURA É A RAÍZ DE TODOS OS PROBLEMAS” DONALD KNUTH
    12. 12. É preciso medir antes de “adivinhar” o que otimizar
    13. 13. É preciso medir antes de “adivinhar” o que otimizar E como medir?
    14. 14. Na medição, duas perguntas precisam ser respondidas
    15. 15. 1 - Quão rápido é meu sistema?
    16. 16. 1 - Quão rápido é meu sistema? Em aplicações Web, a métrica mais comum é o reqs/sec
    17. 17. 1 - Quão rápido é meu sistema? Essa pergunta é respondida com benchmarks
    18. 18. Testes de carga
    19. 19. Testes de carga ApacheBench (ab) Siege - www.joedog.org
    20. 20. 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.59 Server Hostname: shoprizer.localhost Server Port: 80 Document Path: / Document Length: 22320 bytes Concurrency Level: 10 Time taken for tests: 30.010 seconds Complete requests: 4379 Failed requests: 0 Write errors: 0 Total transferred: 99436344 bytes HTML transferred: 97806240 bytes Requests 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
    21. 21. 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 hits Availability: 100.00 % Elapsed time: 29.84 secs Data transferred: 104.49 MB Response time: 0.06 secs Transaction rate: 164.51 trans/sec Throughput: 3.50 MB/sec Concurrency: 9.93 Successful transactions: 4909 Failed transactions: 0 Longest transaction: 2.28 Shortest transaction: 0.00
    22. 22. 2 - Por que meu sistema tem essa performance?
    23. 23. 2 - Por que meu sistema tem essa performance? Profiling
    24. 24. Xdebug arrebenta no profiling!
    25. 25. • Instale a extensão Xdebug a opção xdebug.profiler_enable • Habilite 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
    26. 26. • 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.
    27. 27. KCacheGrind
    28. 28. http://code.google.com/p/webgrind/
    29. 29. • 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
    30. 30. Ajustes nos servidores
    31. 31. APACHE
    32. 32. 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)
    33. 33. 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>
    34. 34. MOD_EXPIRES • Digaao visitante até quando ele pode usar a versão atual de um arquivo sem precisar acessar o servidor novamente • Useo 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
    35. 35. MOD_EXPIRES $ a2enmod expires No seu .htaccess ou configuração do site: ExpiresActive On ExpiresDefault "access plus 30 days" ExpiresByType text/html "access plus 1 month 15 days 2 hours" ExpiresByType image/gif "modification plus 5 hours 3 minutes"
    36. 36. 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> • Paraisso, é feita uma syscall para verificar a existência dos arquivos a cada requisição
    37. 37. 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>
    38. 38. Use um servidor a parte para arquivos estáticos http://static.example.com
    39. 39. Algo mais leve também resolve... Lighttpd nginx thttpd
    40. 40. PHP
    41. 41. APC • PHPcompila 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
    42. 42. APC • Existem outras alternativas com o mesmo propósito • XCache • Zend Platform
    43. 43. 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.
    44. 44. BANCOS DE DADOS MySQL
    45. 45. 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?
    46. 46. 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
    47. 47. MYSQL - MYISAM • Menor consumo de memória e espaço em disco • Utiliza recursos de cache do sistema operacional
    48. 48. 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
    49. 49. ÍNDICES
    50. 50. ÍNDICES • Índices agilizam as buscas e tornam as escritas mais lentas • Transformeem í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.
    51. 51. TIPOS DE DADOS
    52. 52. 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
    53. 53. CACHE
    54. 54. 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
    55. 55. 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.
    56. 56. 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)
    57. 57. 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 • Gerandono disco um arquivo específico para cada registro “cacheado” • Você pode setar um TTL para o objeto em cache
    58. 58. SMARTY http://smarty.net/manual/pt_BR/caching.php <?php require '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);
    59. 59. 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
    60. 60. APC http://br.php.net/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); } ...
    61. 61. 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
    62. 62. MEMCACHE http://br.php.net/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); } ...
    63. 63. MEMCACHE • Memcachetambé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 = memcache session.save_path = "tcp://host_do_memcache:11211"
    64. 64. FUNKY CACHING • FunkyCaching é 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
    65. 65. 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
    66. 66. 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.
    67. 67. 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 a criaçã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);
    68. 68. E A NÍVEL DE BROWSER?
    69. 69. 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
    70. 70. FIREBUG - NET Mostra o tempo de requisição, espera e download de cada componente da página
    71. 71. FIREBUG - NET
    72. 72. YSLOW - GRADE Analisa vários critérios da página, dá “notas” e dá dicas de como melhorar
    73. 73. YSLOW - GRADE
    74. 74. YSLOW - COMPONENTS Permite analisar a carga de cada componente carregado
    75. 75. YSLOW - COMPONENTS
    76. 76. YSLOW - STATISTICS Mostra como a carga está proporcionalmente dividida entre os componentes da página, com cache limpo e “quente”
    77. 77. YSLOW - STATISTICS
    78. 78. YSLOW - TOOLS Ferramentas para compressão de Javascript, imagens, geração de relatórios e análise de código
    79. 79. YSLOW - TOOLS
    80. 80. REFERÊNCIAS • PHP- Simple is Hard - Rasmus Lerdorf - http://talks.php.net/show/ w2e09 • Alta performance em Web Sites - Souders - Editora O’Reilly
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×