php
Jedi
 Boas práticas e
alta 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 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ódigo
 bem 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


• 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 reinvente
a 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 ao
Ctrl + 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ódigo

Mas comentários não
disfarçam códigos
mal escritos
"Don't 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ões
para se
comunicar
Em alguns
lugares do
oriente
médio, esse
gesto...
seria interpretado assim...




Então é melhor não
          inventar!
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ã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 erros
Desenvolva
no modo
E_STRICT
Tratamento
            de erros
Desenvolva
no modo          Use
E_STRICT 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

        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
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.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
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
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çã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 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'));

?>
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ção
var_dump($memcache->get('id_da_informacao'));
?>
Smarty



    Além de separar lógica
        e visualização, faz
                   caching
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);
?>
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.
Armazenamento
em MySQL
Armazenamento
 em MySQL
Performance é
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/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/

Phpjedi 090307090434-phpapp01 2