Upload
felipe-ribeiro
View
55.374
Download
7
Tags:
Embed Size (px)
DESCRIPTION
Palestra apresentada no II Encontro PHP-PB
Citation preview
phpJediBoas práticas e alta performance
Felipe Ribeirohttp://[email protected]
"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!" -
Rasmus Lerdorf
Beleza nem sempre é fundamental
Mas um códigobem escrito faz
toda a diferença!
Boas práticas
Evite o spaghetti
Divida em camadas
• Para separar a aparência da lógica de negócio
• Smarty
• Savant, TinyButStrong, PHPTAL, XSLT, ...
Siga um padrão de
codificação
• Por exemplo, as convenções do Java:
• CamelCase
• Classes começ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 Standardshttp://pear.php.net/manual/en/standards.php
• Zend Framework Coding Standard for PHPhttp://framework.zend.com/manual/en/coding-standard.html
Use o PEAR
Use o PEAR
PHPExtension and Application Repository
• Pacotes escritos por membros ativos da comunidade PHP
• Tudo testado por um time exigente de controle de qualidade.
• Gerenciamento “a la apt-get”:Ex.: pear install Logpear upgrade PHPUnitpear uninstall Text_CAPTCHA
Não reinvente a roda
• Crie do zero apenas o que é específico da sua aplicação
• Reuso de código facilita a manutenção
• Códigos de 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áveis com 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
Mas comentários não disfarçam códigosmal escritos
Comente o código
"Don't comment bad code - rewrite it."
Brian W. Kernighan and P. J. Plaugher
Keep It Simple, Stupid!
Evite qualquer complexidade desnecessária
Keep It Simple, Stupid!
Utilize padrões para se comunicar
Em alguns lugares do oriente médio, esse gesto...
Então é melhor não inventar!
seria interpretado assim...
XML
XML
JSON
JSON
Quebre grandes blocos de código em blocos menores
Quebre grandes blocos de código em blocos menores
Classes e métodos muito grandes devem
ser refatorados
Não use Windows
“PHP Windows developers are second-class citizens” – 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ão reproduz o ambiente de produção mais comum em PHP, o LAMP
• Não tem 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 erros
Desenvolva no modo E_STRICT
Tratamento de erros
Desenvolva no modo E_STRICT
Use Exceptions
e trate-as
display_errors = off
Afinal o usuário não vai depurar o seu
código
Não use o operador @ para suprimir
erros. Atrapalha o debug e deixa a
execução mais lenta
Não confie no usuário
Não confie no usuário
filtre toda entrada
e escape toda saída
Use o Twitter para
algo útil
Crie um perfil privado para a sua aplicação
Crie um perfil privado para a sua aplicação
onde os únicos followers são os desenvolvedores
Utilizando a API, faça com que sua aplicação dê uma “twittada” a cada erro
Performance e Escalabilidade
Performance
Performance
a habilidade que uma aplicação tem de atingir um objetivo, como por exemplo responder no menor tempo possível
Escalabilidade
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
share-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
Xdebug arrebenta no profiling!
• Instale a extensão Xdebug
• Habilite a opção xdebug.profiler_enable 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.
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
Testes de carga
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.59Server Hostname: shoprizer.localhostServer Port: 80
Document Path: /Document Length: 22320 bytes
Concurrency 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
APCFaz cache do opcode do
PHP. Evitando que seja recompilado a cada
execução
APCFaz cache do opcode do
PHP. Evitando que seja recompilado a cada
execução
Também permite fazer cache de informações em memó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 diferentes scripts através do apc_fetchvar_dump(apc_fetch('id_da_informacao'));
?>
Memcached
Memcached
É necessária a execução de um daemon
Memcached
É necessária a execução de 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.
• As camadas 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.
Armazenamento em MySQL
Performance é com MyISAM
Armazenamento em MySQL
Integridade é com InnoDB
Front-end
Front-end
Firebug + YSlow!
<?php $card = array( 'nome' => 'Felipe Ribeiro', 'site' => 'http://feliperibeiro.com', 'e-mail' => '[email protected]', '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 HardRasmus Lerdorf - http://talks.php.net/show/lca09
• Building Scalable Web SitesCal Henderson - O’Reilly Media, Inc. 2006
• Desenvolvendo aplicações Web escaláveisElton Minetto - http://www.eltonminetto.net/docs/app_web_escalaveis.pdf
• Scalable PHPCal 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/