• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Phpjedi 090307090434-phpapp01 2
 

Phpjedi 090307090434-phpapp01 2

on

  • 595 views

 

Statistics

Views

Total Views
595
Views on SlideShare
595
Embed Views
0

Actions

Likes
0
Downloads
7
Comments
0

0 Embeds 0

No embeds

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

    Phpjedi 090307090434-phpapp01 2 Phpjedi 090307090434-phpapp01 2 Presentation Transcript

    • 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 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
    • 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, RestClient• Variáveis (atributos), funções (métodos) começam com minúscula: $user, $this->name, print(), $this->getName()
    • • 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 Framework Coding Standard for PHP http://framework.zend.com/manual/en/ coding-standard.html
    • 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.• Gerenciamento “a la apt-get”: Ex.: pear install Log pear upgrade PHPUnit pear uninstall Text_CAPTCHA
    • 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 confiáveis como PEAR e Zend Framework são bem testados antes de serem disponibilizados.
    • 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 sobre o que é guardado lá (assim como funções, classes e métodos)
    • 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 compiladores úteis para nós, como o gcc• Nãoreproduz o ambiente de produção mais comum em PHP, o LAMP
    • • 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...)
    • 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 a opção xdebug.profiler_enable_trigger para que o log só seja gerado quando você passar ?XDEBUG_PROFILE na URL
    • • 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.
    • 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( ) diz qual o valor máximo de memória que foi usada durante a execução
    • 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 $>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
    • 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
    • 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ém permite fazercache de informações emmemória
    • 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));?>
    • 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 = 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));?>
    • 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->is_cached(noticia.tpl,$id)) { //Carrega do banco de dados}$smarty->display(noticia.tpl,$id);?>
    • Frameworks(de novo? Já vi esse slide!)
    • • 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.
    • 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, fone => (83) 9979-3161);var_dump($card);?>
    • • 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
    • • 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
    • 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/