PHP Jedi - Boas Práticas e Alta Performance

56,353 views
56,251 views

Published on

Palestra apresentada no II Encontro PHP-PB

Published in: Technology
8 Comments
52 Likes
Statistics
Notes
  • Muito boa a apresentação.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • @CarlosFilho15 O processo de geração do opcode é sim um processo de compilação JIT, o código que é interpretado não é o PHP como você escreve, mas sim o opcode que é um código intermediário gerado nessa compilação (como o bytecode de Java).
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • No slide 77 é feita uma referência ao cache opcode do PHP. Como o PHP é uma linguagem interpretada, não há compilação de código. O arquivo fonte é lido e executado toda vez que chamado.

    Dessa forma, é incoerente tratar de compilação, pois não é gerado um novo código processado por uma máquina de compilação.

    O cache opcode evita que algumas tarefas sejam refeitas a cada execução do código, tornando o processo de tradução mais rápido. Recomendo fortemente a utilização de qualquer ferramenta de opcode, seja xcache, apc, eaccelerator, todas fazem esse papel muito bem e melhoram significativamente a performance da aplicação.

    Parabéns pela apresentação, é realmente muito boa!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Excelente apresentação.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Parabéns pela belíssima apresentação e conteúdo direto, simples e efetivo. Espero algum dia assistir uma palestra sua. =)
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
56,353
On SlideShare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
728
Comments
8
Likes
52
Embeds 0
No embeds

No notes for slide

PHP Jedi - Boas Práticas e Alta Performance

  1. 1. php Jedi Boas práticas e alta performance Felipe Ribeiro http://feliperibeiro.com felipernb@gmail.com
  2. 2. quot;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 are looking for purity, you are in the wrong boat. Get out now before you get hit by a wet cat!quot; - Rasmus Lerdorf
  3. 3. Beleza nem sempre é fundamental
  4. 4. Mas um código bem escrito faz toda a diferença!
  5. 5. Boas práticas
  6. 6. Evite o spaghetti
  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 de codificação
  10. 10. exemplo, as convenções do Java: • Por • 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 reinvente a 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 ao Ctrl + 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 com nomes como: $xpto, $foo, • Variáveis $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ódigo Mas comentários não disfarçam códigos mal escritos
  27. 27. quot;Don't comment bad code - rewrite it.quot; 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ões para se comunicar
  31. 31. Em alguns lugares do oriente médio, esse gesto...
  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 grandes blocos de código em blocos menores
  38. 38. Quebre grandes blocos de código em blocos menores Classes e métodos muito grandes devem ser refatorados
  39. 39. Não use Windows
  40. 40. “PHP Windows developers are second-class citizens” – 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 erros Desenvolva no modo E_STRICT
  45. 45. Tratamento de erros Desenvolva no modo Use E_STRICT Exceptions e trate-as
  46. 46. display_errors = off Afinal 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 a execução mais lenta
  48. 48. Não confie no usuário
  49. 49. Não confie no usuário filtre toda entrada
  50. 50. e escape toda saída
  51. 51. Use o Twitter para algo útil
  52. 52. Crie um perfil privado para a sua aplicação
  53. 53. Crie um perfil privado para a sua aplicação onde os únicos followers são os desenvolvedores
  54. 54. Utilizando a API, faça com que sua aplicação dê uma “twittada” a cada erro
  55. 55. Performance e Escalabilidade
  56. 56. Performance
  57. 57. Performance a habilidade que uma aplicação tem de atingir um objetivo, como por exemplo responder no menor tempo possível
  58. 58. Escalabilidade
  59. 59. Escalabilidade a habilidade de uma aplicação manter a performance quando a carga de trabalho aumenta.
  60. 60. PHP não é tão rápido...
  61. 61. Porém sua arquitetura share-nothing simplifica a escalabilidade
  62. 62. E PHP dificilmente é o gargalo
  63. 63. A maior parte do tempo é gasto no banco de dados ou com o carregamento do front-end
  64. 64. Sempre dá para espremer e melhorar
  65. 65. Xdebug arrebenta no profiling!
  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. Testes de carga
  72. 72. Testes de carga ApacheBench (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 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
  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 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
  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ção Também permite fazer cache de informações em memória
  78. 78. APC <?php $valor = 'Informação que quero armazenar'; //Armazena o valor no cache em memória do APC apc_store('id_da_informacao', $valor); // O valor pode ser recuperado em diferentes scripts através do apc_fetch var_dump(apc_fetch('id_da_informacao')); ?>
  79. 79. Memcached
  80. 80. Memcached É necessária a execução de um daemon
  81. 81. Memcached É necessária a execução de 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ção var_dump($memcache->get('id_da_informacao')); ?>
  83. 83. Smarty Além de separar lógica e visualização, faz caching
  84. 84. Smarty <?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); ?>
  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. Armazenamento em MySQL
  88. 88. Armazenamento em MySQL Performance é 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/123356305 http://flickr.com/photos/chriskueh/2277679121 http://www.flickr.com/photos/awfulsara/59884516/ http://www.flickr.com/photos/zach_manchester/2302683790/ http://flickr.com/photos/toofarnorth/2691097127 http://flickr.com/photos/suttonhoo22/247107220 http://flickr.com/photos/conskeptical/191048988 http://flickr.com/photos/kazk/198640938 http://flickr.com/photos/jakecaptive/49915119 http://www.myfreewallpapers.net/music/wallpapers/kiss-fire.jpg http://flickr.com/photos/chrisjones/12827874/ http://flickr.com/photos/jorel314/2950338887 http://flickr.com/photos/jmarty/1804061993 http://flickr.com/photos/cw_ye/2952033606 http://flickr.com/photos/vgm8383/2191223539 http://flickr.com/photos/petecarr/475437514 http://flickr.com/photos/capsicina/361735510 http://flickr.com/photos/schlomo/3304431482/ http://flickr.com/photos/seandreilinger/133250112/ http://flickr.com/photos/mesolimbo/2543327787 http://flickr.com/photos/hamed/155343130/ http://flickr.com/photos/deniscollette/1817034358 http://flickr.com/photos/robertjosiah/2690194447/ http://flickr.com/photos/blahflowers/1571042854/ http://flickr.com/photos/dey/2203203306/ http://flickr.com/photos/thomashawk/24089964 http://flickr.com/photos/jasohill/118616905/ http://flickr.com/photos/tunnelarmr/2435107204 http://flickr.com/photos/oberazzi/318947873 http://flickr.com/photos/polegario/230055697/ http://flickr.com/photos/cwm/300412682/

×