Otimizacao de websites em PHP
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Otimizacao de websites em PHP

on

  • 8,202 views

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

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

Statistics

Views

Total Views
8,202
Views on SlideShare
8,155
Embed Views
47

Actions

Likes
14
Downloads
192
Comments
3

6 Embeds 47

http://www.slideshare.net 37
http://comandoweb.blogspot.com 3
http://www.linkedin.com 3
http://feeds.feedburner.com 2
http://us-w1.rockmelt.com 1
http://comandoweb.blogspot.com.br 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Otimizacao de websites em PHP Presentation Transcript

  • 1. OTIMIZANDO A PERFORMANCE DE WEBSITES EM PHP
  • 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. 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. Performance a habilidade que uma aplicação tem de atingir um objetivo, como por exemplo responder no menor tempo possível
  • 5. Escalabilidade a habilidade de uma aplicação manter a performance quando a carga de trabalho aumenta.
  • 6. PHP não é tão rápido...
  • 7. Porém sua arquitetura shared- nothing simplifica a escalabilidade
  • 8. E PHP dificilmente é o gargalo
  • 9. A maior parte do tempo é gasto no banco de dados ou com o carregamento do front-end
  • 10. Sempre dá para espremer e melhorar
  • 11. “OTIMIZAÇÃO PREMATURA É A RAÍZ DE TODOS OS PROBLEMAS” DONALD KNUTH
  • 12. É preciso medir antes de “adivinhar” o que otimizar
  • 13. É preciso medir antes de “adivinhar” o que otimizar E como medir?
  • 14. Na medição, duas perguntas precisam ser respondidas
  • 15. 1 - Quão rápido é meu sistema?
  • 16. 1 - Quão rápido é meu sistema? Em aplicações Web, a métrica mais comum é o reqs/sec
  • 17. 1 - Quão rápido é meu sistema? Essa pergunta é respondida com benchmarks
  • 18. Testes de carga
  • 19. Testes de carga ApacheBench (ab) Siege - www.joedog.org
  • 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. 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. 2 - Por que meu sistema tem essa performance?
  • 23. 2 - Por que meu sistema tem essa performance? Profiling
  • 24. Xdebug arrebenta no profiling!
  • 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. • 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. KCacheGrind
  • 28. http://code.google.com/p/webgrind/
  • 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. Ajustes nos servidores
  • 31. APACHE
  • 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. 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. 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. 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. 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. 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. Use um servidor a parte para arquivos estáticos http://static.example.com
  • 39. Algo mais leve também resolve... Lighttpd nginx thttpd
  • 40. PHP
  • 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. APC • Existem outras alternativas com o mesmo propósito • XCache • Zend Platform
  • 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. BANCOS DE DADOS MySQL
  • 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. 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. MYSQL - MYISAM • Menor consumo de memória e espaço em disco • Utiliza recursos de cache do sistema operacional
  • 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. ÍNDICES
  • 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. TIPOS DE DADOS
  • 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. CACHE
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. E A NÍVEL DE BROWSER?
  • 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. FIREBUG - NET Mostra o tempo de requisição, espera e download de cada componente da página
  • 71. FIREBUG - NET
  • 72. YSLOW - GRADE Analisa vários critérios da página, dá “notas” e dá dicas de como melhorar
  • 73. YSLOW - GRADE
  • 74. YSLOW - COMPONENTS Permite analisar a carga de cada componente carregado
  • 75. YSLOW - COMPONENTS
  • 76. YSLOW - STATISTICS Mostra como a carga está proporcionalmente dividida entre os componentes da página, com cache limpo e “quente”
  • 77. YSLOW - STATISTICS
  • 78. YSLOW - TOOLS Ferramentas para compressão de Javascript, imagens, geração de relatórios e análise de código
  • 79. YSLOW - TOOLS
  • 80. REFERÊNCIAS • PHP- Simple is Hard - Rasmus Lerdorf - http://talks.php.net/show/ w2e09 • Alta performance em Web Sites - Souders - Editora O’Reilly