phpJedi Boas práticas ealta performance    Felipe Ribeiro    http://feliperibeiro.com    felipernb@gmail.com
"PHP is not about purity in CS principles or   architecture; it is about solving the ugly web problem with an admittedly u...
Beleza nem sempre é        fundamental
Mas um código bem escrito faztoda a diferença!
Boas práticas
Evite ospaghetti
Divida em camadas
• Para     separar a aparência da lógica de negócio• Smarty• Savant,   TinyButStrong, PHPTAL, XSLT, ...
Siga um padrão decodificação
• Por   exemplo, as convenções do Java:• CamelCase• Classescomeçam com maiúscula: FrontController, DatabaseConnection, Res...
• Constantes,toda em maiúscula com underline para separar palavras: DATABASE_LOGIN, BASE_DIR
• Existem   diversas convenções para PHP• PEAR  Coding Standards http://pear.php.net/manual/en/ standards.php• Zend  Frame...
Use o PEAR
Use o PEAR  PHP  Extension and  Application  Repository
• Pacotes        escritos por membros ativos da comunidade PHP• Tudotestado por um time exigente de controle de qualidade....
Não reinventea roda
• Crie     do zero apenas o que é específico da sua aplicação• Reuso   de código facilita a manutenção• Códigosde fontes co...
Diga não aoCtrl + C, Ctrl + V
• Se   o mesmo código precisa ser usado em mais de um lugar, não copie!• Encapsule   numa função/método
Frameworks
• Zend   Framework• CakePHP• Symfony• Prado• CodeIgniter
• Ajuda   a separar camadas• Padrões   de codificação• Reaproveitamento   de código• Aprecie     com moderação!*
Escolha bons nomes
• Nomes relevantes ajudam no entendimento do código• Variáveiscom nomes como: $xpto, $foo, $bar, etc... não dizem nada sob...
Comente o   código
Comente o            códigoMas comentários nãodisfarçam códigosmal escritos
"Dont comment bad  code - rewrite it." Brian W. Kernighan and P. J. Plaugher
Keep It Simple,Stupid!
Keep It Simple,Stupid!       Evite qualquer        complexidade       desnecessária
Utilize padrõespara secomunicar
Em algunslugares doorientemédio, essegesto...
seria interpretado assim...Então é melhor não          inventar!
XML
XML
JSON
JSON
Quebre grandesblocos de códigoem blocos menores
Quebre grandesblocos de códigoem blocos menores  Classes e métodosmuito grandes devem      ser refatorados
Não use Windows
“PHP Windowsdevelopers aresecond-classcitizens” –Rasmus Lerdorf
• Windows não é a plataforma ideal para desenvolvedores• Não   tem um terminal poderoso• Não vem “de fábrica” com compilad...
• Nãotem um gerenciador de pacotes que permita atualizar e adicionar/remover módulos do PHP de maneira trivial.• Não    te...
Tratamento   de erros
Tratamento            de errosDesenvolvano modoE_STRICT
Tratamento            de errosDesenvolvano modo          UseE_STRICT Exceptions           e trate-as
display_errors = offAfinal o usuário não  vai depurar o seu            código
Não use o operador    @ para suprimir  erros. Atrapalha o    debug e deixa aexecução mais lenta
Não confieno usuário
Não confieno usuário       filtre toda       entrada
e escapetoda saída
Use oTwitter para    algo útil
Crie um perfilprivado para asua aplicação
Crie um perfilprivado para asua aplicação   onde os únicos  followers são os  desenvolvedores
Utilizando a API,faça com que suaaplicação dê uma“twittada” a cadaerro
Performance eEscalabilidade
Performance
Performancea habilidade que umaaplicação tem de atingir umobjetivo, como por exemploresponder no menor tempopossível
Escalabilidade
Escalabilidadea habilidade de uma aplicaçãomanter a performance quandoa carga de trabalho aumenta.
PHP nãoé tãorápido...
Porém sua   arquiteturashare-nothing   simplifica aescalabilidade
E PHPdificilmenteé o gargalo
A maior parte do  tempo é gasto no banco de dados oucom o carregamento       do front-end
Sempre dá paraespremer e melhorar
Xdebugarrebenta noprofiling!
• Instale   a extensão Xdebug        a opção xdebug.profiler_enable• Habilite caso queira que toda execução gere o log• Ou ...
• Rode   o script que você quer analisar• Abra     o log gerado pelo Xdebug no KCacheGrind caso use Linux, ou no WebGrind ...
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(  ) ...
Testesde carga
Testesde cargaApacheBench (ab)Siege - www.joedog.org
Macintosh:~ felipe$ ab -c 10 -t 30 -b -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.The...
Caching
APC  Faz cache do opcode do   PHP. Evitando que seja       recompilado a cada                execução
APC      Faz cache do opcode do       PHP. Evitando que seja           recompilado a cada                    execuçãoTambé...
APC<?php$valor = Informação que quero armazenar;//Armazena o valor no cache em memória do APCapc_store(id_da_informacao, $...
Memcached
MemcachedÉ necessária a execuçãode um daemon
MemcachedÉ necessária a execuçãode um daemon  Ideal para objetos pequenos
Memcached<?php$memcache = new Memcache();//Conecta no servidor memcached$memcache->connect(localhost, 11211);$valor = Info...
Smarty    Além de separar lógica        e visualização, faz                   caching
Smarty<?phprequire smarty/Smarty.class.php;$id = (int) $_GET[id];$smarty = new Smarty();$smarty->caching = 1;if(!$smarty->...
Frameworks(de novo? Já vi esse slide!)
• Frameworks  ajudam em aplicações com funcionalidades comuns.• Ascamadas genéricas de um framework acabam gerando overhea...
Armazenamentoem MySQL
Armazenamento em MySQLPerformance écom MyISAM        Integridade é         com InnoDB
Front-end
Front-end Firebug + YSlow!
<?php$card = array(    nome => Felipe Ribeiro,    site => http://feliperibeiro.com,    e-mail => felipernb@gmail.com,    f...
• YSlow:http://developer.yahoo.com/yslow• Siege:http://www.joedog.org/JoeDog/Siege• Xdebug      Profiling: http://xdebug.or...
•   Simple is Hard    Rasmus Lerdorf - http://talks.php.net/show/lca09•   Building Scalable Web Sites    Cal Henderson - O...
http://www.flickr.com/photos/jeniee/123356305http://flickr.com/photos/chriskueh/2277679121http://www.flickr.com/photos/awfuls...
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
Próximos SlideShares
Carregando em…5
×

Phpjedi 090307090434-phpapp01 2

743 visualizações

Publicada em

0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
743
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1
Ações
Compartilhamentos
0
Downloads
8
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Phpjedi 090307090434-phpapp01 2

  1. 1. phpJedi Boas práticas ealta performance Felipe Ribeiro http://feliperibeiro.com felipernb@gmail.com
  2. 2. "PHP is not about purity in CS principles or architecture; it is about solving the ugly web problem with an admittedly ugly, but extremely functional and convenient solution. If you arelooking for purity, you are in the wrong boat. Get out now before you get hit by a wet cat!" - Rasmus Lerdorf
  3. 3. Beleza nem sempre é fundamental
  4. 4. Mas um código bem escrito faztoda a diferença!
  5. 5. Boas práticas
  6. 6. Evite ospaghetti
  7. 7. Divida em camadas
  8. 8. • Para separar a aparência da lógica de negócio• Smarty• Savant, TinyButStrong, PHPTAL, XSLT, ...
  9. 9. Siga um padrão decodificação
  10. 10. • Por exemplo, as convenções do Java:• CamelCase• Classescomeçam com maiúscula: FrontController, DatabaseConnection, RestClient• Variáveis (atributos), funções (métodos) começam com minúscula: $user, $this->name, print(), $this->getName()
  11. 11. • Constantes,toda em maiúscula com underline para separar palavras: DATABASE_LOGIN, BASE_DIR
  12. 12. • Existem diversas convenções para PHP• PEAR Coding Standards http://pear.php.net/manual/en/ standards.php• Zend Framework Coding Standard for PHP http://framework.zend.com/manual/en/ coding-standard.html
  13. 13. Use o PEAR
  14. 14. Use o PEAR PHP Extension and Application Repository
  15. 15. • Pacotes escritos por membros ativos da comunidade PHP• Tudotestado por um time exigente de controle de qualidade.• Gerenciamento “a la apt-get”: Ex.: pear install Log pear upgrade PHPUnit pear uninstall Text_CAPTCHA
  16. 16. Não reinventea roda
  17. 17. • Crie do zero apenas o que é específico da sua aplicação• Reuso de código facilita a manutenção• Códigosde fontes confiáveis como PEAR e Zend Framework são bem testados antes de serem disponibilizados.
  18. 18. Diga não aoCtrl + C, Ctrl + V
  19. 19. • Se o mesmo código precisa ser usado em mais de um lugar, não copie!• Encapsule numa função/método
  20. 20. Frameworks
  21. 21. • Zend Framework• CakePHP• Symfony• Prado• CodeIgniter
  22. 22. • Ajuda a separar camadas• Padrões de codificação• Reaproveitamento de código• Aprecie com moderação!*
  23. 23. Escolha bons nomes
  24. 24. • Nomes relevantes ajudam no entendimento do código• Variáveiscom nomes como: $xpto, $foo, $bar, etc... não dizem nada sobre o que é guardado lá (assim como funções, classes e métodos)
  25. 25. Comente o código
  26. 26. Comente o códigoMas comentários nãodisfarçam códigosmal escritos
  27. 27. "Dont comment bad code - rewrite it." Brian W. Kernighan and P. J. Plaugher
  28. 28. Keep It Simple,Stupid!
  29. 29. Keep It Simple,Stupid! Evite qualquer complexidade desnecessária
  30. 30. Utilize padrõespara secomunicar
  31. 31. Em algunslugares doorientemédio, essegesto...
  32. 32. seria interpretado assim...Então é melhor não inventar!
  33. 33. XML
  34. 34. XML
  35. 35. JSON
  36. 36. JSON
  37. 37. Quebre grandesblocos de códigoem blocos menores
  38. 38. Quebre grandesblocos de códigoem blocos menores Classes e métodosmuito grandes devem ser refatorados
  39. 39. Não use Windows
  40. 40. “PHP Windowsdevelopers aresecond-classcitizens” –Rasmus Lerdorf
  41. 41. • Windows não é a plataforma ideal para desenvolvedores• Não tem um terminal poderoso• Não vem “de fábrica” com compiladores úteis para nós, como o gcc• Nãoreproduz o ambiente de produção mais comum em PHP, o LAMP
  42. 42. • Nãotem um gerenciador de pacotes que permita atualizar e adicionar/remover módulos do PHP de maneira trivial.• Não tem um bom gerenciamento de memória.• Dêuma chance ao Linux ou algum sabor de Unix (FreeBSD, Mac OS X, etc...)
  43. 43. Tratamento de erros
  44. 44. Tratamento de errosDesenvolvano modoE_STRICT
  45. 45. Tratamento de errosDesenvolvano modo UseE_STRICT Exceptions e trate-as
  46. 46. display_errors = offAfinal o usuário não vai depurar o seu código
  47. 47. Não use o operador @ para suprimir erros. Atrapalha o debug e deixa aexecução mais lenta
  48. 48. Não confieno usuário
  49. 49. Não confieno usuário filtre toda entrada
  50. 50. e escapetoda saída
  51. 51. Use oTwitter para algo útil
  52. 52. Crie um perfilprivado para asua aplicação
  53. 53. Crie um perfilprivado para asua aplicação onde os únicos followers são os desenvolvedores
  54. 54. Utilizando a API,faça com que suaaplicação dê uma“twittada” a cadaerro
  55. 55. Performance eEscalabilidade
  56. 56. Performance
  57. 57. Performancea habilidade que umaaplicação tem de atingir umobjetivo, como por exemploresponder no menor tempopossível
  58. 58. Escalabilidade
  59. 59. Escalabilidadea habilidade de uma aplicaçãomanter a performance quandoa carga de trabalho aumenta.
  60. 60. PHP nãoé tãorápido...
  61. 61. Porém sua arquiteturashare-nothing simplifica aescalabilidade
  62. 62. E PHPdificilmenteé o gargalo
  63. 63. A maior parte do tempo é gasto no banco de dados oucom o carregamento do front-end
  64. 64. Sempre dá paraespremer e melhorar
  65. 65. Xdebugarrebenta noprofiling!
  66. 66. • 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
  67. 67. • 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.
  68. 68. KCacheGrind
  69. 69. http://code.google.com/p/webgrind/
  70. 70. • 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
  71. 71. Testesde carga
  72. 72. Testesde cargaApacheBench (ab)Siege - www.joedog.org
  73. 73. Macintosh:~ felipe$ ab -c 10 -t 30 -b -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 requestsServer Software: Apache/2.0.59Server Hostname: shoprizer.localhostServer Port: 80Document Path: /Document Length: 22320 bytesConcurrency 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
  74. 74. 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
  75. 75. Caching
  76. 76. APC Faz cache do opcode do PHP. Evitando que seja recompilado a cada execução
  77. 77. APC Faz cache do opcode do PHP. Evitando que seja recompilado a cada execuçãoTambém permite fazercache de informações emmemória
  78. 78. APC<?php$valor = Informação que quero armazenar;//Armazena o valor no cache em memória do APCapc_store(id_da_informacao, $valor);// O valor pode ser recuperado em diferentesscripts através do apc_fetchvar_dump(apc_fetch(id_da_informacao));?>
  79. 79. Memcached
  80. 80. MemcachedÉ necessária a execuçãode um daemon
  81. 81. MemcachedÉ necessária a execuçãode um daemon Ideal para objetos pequenos
  82. 82. Memcached<?php$memcache = new Memcache();//Conecta no servidor memcached$memcache->connect(localhost, 11211);$valor = Informação que quero armazenar;//Envia via socket a informação para o memcached$memcache->set(id_da_informacao, $valor);//Recupera a informaçãovar_dump($memcache->get(id_da_informacao));?>
  83. 83. Smarty Além de separar lógica e visualização, faz caching
  84. 84. 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);?>
  85. 85. Frameworks(de novo? Já vi esse slide!)
  86. 86. • Frameworks ajudam em aplicações com funcionalidades comuns.• Ascamadas genéricas de um framework acabam gerando overhead.• Na necessidade de alta performance, você vai precisar abrir mão de certos “luxos” para ter mais flexibilidade e fazer o tunning.
  87. 87. Armazenamentoem MySQL
  88. 88. Armazenamento em MySQLPerformance écom MyISAM Integridade é com InnoDB
  89. 89. Front-end
  90. 90. Front-end Firebug + YSlow!
  91. 91. <?php$card = array( nome => Felipe Ribeiro, site => http://feliperibeiro.com, e-mail => felipernb@gmail.com, fone => (83) 9979-3161);var_dump($card);?>
  92. 92. • YSlow:http://developer.yahoo.com/yslow• Siege:http://www.joedog.org/JoeDog/Siege• Xdebug Profiling: http://xdebug.org/docs/ profiler• Filter: http://php.net/filter
  93. 93. • Simple is Hard Rasmus Lerdorf - http://talks.php.net/show/lca09• Building Scalable Web Sites Cal Henderson - O’Reilly Media, Inc. 2006• Desenvolvendo aplicações Web escaláveis Elton Minetto - http://www.eltonminetto.net/docs/ app_web_escalaveis.pdf• Scalable PHP Cal Henderson - http://www.slideshare.net/iamcal/scalable-php- presentation
  94. 94. http://www.flickr.com/photos/jeniee/123356305http://flickr.com/photos/chriskueh/2277679121http://www.flickr.com/photos/awfulsara/59884516/http://www.flickr.com/photos/zach_manchester/2302683790/http://flickr.com/photos/toofarnorth/2691097127http://flickr.com/photos/suttonhoo22/247107220http://flickr.com/photos/conskeptical/191048988http://flickr.com/photos/kazk/198640938http://flickr.com/photos/jakecaptive/49915119http://www.myfreewallpapers.net/music/wallpapers/kiss-fire.jpghttp://flickr.com/photos/chrisjones/12827874/http://flickr.com/photos/jorel314/2950338887http://flickr.com/photos/jmarty/1804061993http://flickr.com/photos/cw_ye/2952033606http://flickr.com/photos/vgm8383/2191223539http://flickr.com/photos/petecarr/475437514http://flickr.com/photos/capsicina/361735510http://flickr.com/photos/schlomo/3304431482/http://flickr.com/photos/seandreilinger/133250112/http://flickr.com/photos/mesolimbo/2543327787http://flickr.com/photos/hamed/155343130/http://flickr.com/photos/deniscollette/1817034358http://flickr.com/photos/robertjosiah/2690194447/http://flickr.com/photos/blahflowers/1571042854/http://flickr.com/photos/dey/2203203306/http://flickr.com/photos/thomashawk/24089964http://flickr.com/photos/jasohill/118616905/http://flickr.com/photos/tunnelarmr/2435107204http://flickr.com/photos/oberazzi/318947873http://flickr.com/photos/polegario/230055697/http://flickr.com/photos/cwm/300412682/

×