PHP Jedi - Boas Práticas e Alta Performance

Post on 20-Jan-2015

55,374 views 7 download

Tags:

description

Palestra apresentada no II Encontro PHP-PB

transcript

phpJediBoas práticas e alta performance

Felipe Ribeirohttp://feliperibeiro.comfelipernb@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 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

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.

• 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

Testes de carga

ApacheBench (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 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' => 'felipernb@gmail.com', 'fone' => '(83) 9979-3161' ); var_dump($card); ?>

• 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/