Como se tornar um
viciado em performance
em 5 passos
Pedro Chaves - 3º PHPMG Talks
O primeiro motivo

Ninguém elogia um site
rápido, mas todos reclamam
de um site lento.
Tempo de atraso   Reação do usuário
0 - 100ms         Instantânea
100 - 300ms       Atraso perceptível
300 - 1000ms      Computador trabalhando...
1s+               Começa a perder o foco
10s+              Eu volto depois...
100ms por
  página


 1% de
 receita
Tempo de
 disparo de
  onLoad




15% tempo de
 permanência
O quarto motivo

Seu site nunca será
rápido o suficiente
sozinho.
O quinto motivo

Melhorar a
performance é uma via
de mão dupla.
Onde você busca seus
      dados?


#1
O MySQL é o lugar mais
lento para buscar seus
        dados.
Seus novos melhores
amigos




Que tal salvar os dados em lugares alternativos?
Seus novos melhores
amigos




Redis salva em memória RAM ou em disco
Se dados não mudam
toda hora, não precisa
  buscá-los toda hora
Rotina toda              Se não existe busca
     madrugada                    do arquivo




  Salva um arquivo
 JSON no disco e um              Site busca do
     registro no                 Memcached
    Memcached




Crontab é seu melhor amigo!
Seus novos melhores
amigos




Memcached + arquivo em disco gerado por rotina
Como sua aplicação
     processa os dados?


#2
A qualidade do seu código
interfere na velocidade da
      sua aplicação.
The KISS principle

Nem sempre o código mais
bonito é o mais rápido ou
eficiente.
The KISS principle
KEEP
  IT
SIMPLE
STUPID
APC - Alternative
            PHP Cache


Dicas rápidas - Habilite APC
__autoload não!
                               (confirmado pelo próprio Rasmus)




Dicas rápidas - Habilite APC
Dicas rápidas - Passe parâmetros por referência
Dicas rápidas - Utilize funções nativas
Dicas rápidas - Junte técnicas
The KISS principle

As vezes é necessário abrir
mão de conceitos de
engenharia de software em
troca de performance.
SELECT COUNT(*), a.nome AS nome_artista
FROM artistas AS a
INNER JOIN musicas AS m ON m.id_artista = a.id
WHERE m.id_artista = ?
GROUP BY m.id_artista



Dicas rápidas de performance
SELECT nome, num_musicas
FROM artistas
WHERE id_artista = ?


Dicas rápidas de performance
Quando sua aplicação
 processa os dados?


#3
Você realmente precisa
executar seu código toda
         hora?
Que tal colocar uma camada de
cache no retorno de todas as
requisições?



Checkpoint #3
Varnish, seu melhor amigo
O protocolo HTTP está aí para ser
utilizado da maneira correta!
                                Porque nosso navegador também faz
                                cache por nós :D




Protocolo HTTP to the rescue!
Last-Modified + If-
Modified-Since

 O servidor só envia o conteúdo da página
 se If-Modified-Since não for enviado ou
     for menor do que Last-Modified.


      304 Not Modified
Expires

    Não busca a página no servidor se o
    tempo do cache não tiver expirado


Expires: Sun, 17-Jan-2038 19:14:07 GMT
ETag + If-None-Match

    "Versão" daquela requisição.
   Pode conter qualquer conteúdo,
         escolhido por você.


           ETag: JSV1
Quanto menos
       melhor!


#4
A requisição mais
rápida é aquela que
    não existe.
Checklist
● Só um arquivo CSS ✓
A primeira impressão
     é a que fica.
Checklist
● Só um arquivo CSS ✓
● JavaScript no rodapé ✓
Checklist
● Só um arquivo CSS ✓
● JavaScript no rodapé ✓
● Poucos arquivos JavaScript ✓
Google Closure
                    YUI Compressor
  Compiler



      Minificar JavaScript e
               CSS!



   UglifyJS             CSSMin
Checklist
●   Só um arquivo CSS ✓
●   JavaScript no rodapé ✓
●   Poucos arquivos JavaScript ✓
●   Minificar JS / CSS ✓
$LAB.js             head.js


     Dois JavaScript não
   carregam juntos. A não
    ser que você queira...



RequireJS            YepNope
Checklist
●   Só um arquivo CSS ✓
●   JavaScript no rodapé ✓
●   Poucos arquivos JavaScript ✓
●   Minificar JS / CSS ✓
●   JavaScript assíncrono ✓
Cookies são inúteis
  para arquivos
    estáticos.
Checklist
●   Só um arquivo CSS ✓
●   JavaScript no rodapé ✓
●   Poucos arquivos JavaScript ✓
●   Minificar JS / CSS ✓
●   JavaScript assíncrono ✓
●   Content Delivery Network ✓
gzip!
 até 80% do tamanho da requisição :D
Checklist
●   Só um arquivo CSS ✓
●   JavaScript no rodapé ✓
●   Poucos arquivos JavaScript ✓
●   Minificar JS / CSS ✓
●   JavaScript assíncrono ✓
●   Content Delivery Network ✓
●   gzip ✓
Otimize TODAS as
    imagens!
         jpegoptim faz isso por você ;)
base64 === -1 hit
Checklist
●   Só um arquivo CSS ✓
●   JavaScript no rodapé ✓
●   Poucos arquivos JavaScript ✓
●   Minificar JS / CSS ✓
●   JavaScript assíncrono ✓
●   Content Delivery Network ✓
●   gzip ✓
●   Imagens otimizadas ✓
Checklist
●   Só um arquivo CSS ✓
●   JavaScript no rodapé ✓
●   Poucos arquivos JavaScript ✓
●   Minificar JS / CSS ✓
●   JavaScript assíncrono ✓
●   Content Delivery Network ✓
●   gzip ✓
●   Imagens otimizadas ✓
●   CSS Sprites ✓
Dicas finais


#5
"Existem duas coisas
difíceis em TI: dar nome às
 coisas e invalidar cache"
                     Alguém muito sábio
Cache incremental
         vs.
Refazer todo o cache
         vs.
   Excluir o cache
PHP não possui um
paradigma só. Se aproveite
          disso.
Teste sua performance!
PageSpeed e YSlow podem
        te ajudar.
Obrigado!

Como se tornar um viciado em performance em 5 passos