Desempenho do servidor reflete diretamente no indice de satisfação do cliente pelo seu serviço, diretamente no Google, já que ele adora sites que sejam rápidos e a sua de ter uma aplicação rápida.

Primeira item a ser verificado é o servidor. O php-apc pode ajudar em muito. Também tem o eAccelerator e o XCache. Também o mod_deflate ajuda para que os códigos gerados chegem mais rápido até o cliente.

Utilize o NGINX para os assets (imagens, CSS e JS, SWF e tudo mais que for estático).

Mais esta tarefa também é do programador que deve gerar códigos que sejam executados mais rápidos pelo servidor.

Veja a seguir uma lista de testes:

Dica 1

require() é mais lento que o include() e o [require/include]_once é mais lentos ainda;

Mais continue usando o require que é mais confiável...

Dica 2

Sempre use caminhos absolutos ao chamar arquivos no require/include. Isso porque o PHP não precisará buscar e analisar o include_path;

// Ex:  
require( '/home/seusiote/public_html/classes/ClasseSeiLa.php' );

Imagine que seu servido tenha um include_path de várias pastas. Ele terá que testar em todas as pastas para ver se encontra o arquivo que você esta tentando carregar. Se ele possuir o caminho absoluto não precisará fazer nenhuma validação.

Dica 3

echo é mais rápido que o print;
Veja os testes: /code/10050/Captura de tela 2013-12-18 as 18.01.21.png

Dica 4

echo com parâmetros é mais rápido que echo com concatenação;

Dica 5

Aspas simples é mais rápido processar que aspas duplas;

// EX lento:
echo "A variável seila possui o valor = $seila";
// EX rápido: 
echo 'A variável seila possui o valor = ' . $seila; 
// EX mais rápido: 
echo 'A variável seila possui o valor = ', $seila;

Veja os testes: /code/10050/Captura de tela 2013-12-18 as 18.11.12.pdf

Dica 6

Evite calcular os tamanho dos elementos dentro do laço FOR.

// Ex Errado:  
for( $i=0; $i<count( $array ); $i++ )
    ...
// Ex Certo:  
$size = count( $array ); 
for( $i=0; $i< $size; $i++ )
    ...

Veja os testes: /code/10050/Captura de tela 2013-12-18 as 22.43.18.png

Dica 7

Métodos mágicos como o __autoload, __get, __set trabalham com erros do PHP e devem ser economizados ao máximo;

Dica 8

Usar o "@" em funções para evitar erros, além de ser POG é lento para o PHP. Se sabe que vai dar erro, valide antes;

Dica 9

Jamais use string sem aspas. Vejo que tem gente que programa assim: $array[coluna] e isso é muito lento ao PHP, visto que o PHP irá checar se o "coluna" é uma constantes antes de usa-lo como string. Ou seja, é POG.... Testes mostram que usando aspas o código é executado mais rápido:

// Ex errado
echo $array[coluna];
// Ex rápido
echo $array["coluna"];
// Ex mais rápido
echo $array['coluna'];

Veja os testes: /code/10050/Captura de tela 2013-12-18 as 22.47.36.png

Dica 10

Variáveis locais são mais rápidas. Então se precisar alterar muitas vezes o valor de uma variável GLOBAL o faça apenas uma vês

// Ex lento
function seiLa() {
    GLOBAL $teste;
    for ( $i=0; $i<20; $i++ )
        $teste .= "bla bla bla"
}
// Ex mais rápido
function seiLa() {
    GLOBAL $teste;
    $testeLocal = $teste;
    for ( $i=0; $i<20; $i++ )
        $testeLocal .= "bla bla bla";
    $teste = $testeLocal; 
}

Veja os testes: /code/10050/Captura de tela 2013-12-18 as 23.12.34.png

Dica 11

Evite ao máximo as aspas duplas. String com aspas duplas são processadas pelo servidor em busca de variáveis e caracteres especiais.

// Ex lento
echo "<p style="width:10px;">teste sei la e só texto aqui</p>";
// Ex mais rápido
echo '<p style="width:10px;">teste sei la e só texto aqui</p>';

Veja os testes: /code/10050/Captura de tela 2013-12-18 as 23.24.49.png

Dica 12

Você sabia que ++$var é mais rápido que $var++? Mais não tanto a ponto de valer a penas alterar seus códigos...

E sobre o servidor?

E, não se esquecendo que Windows para servidor JAMAIS: http://www.paessler.com/webstress/sample_performance_tests/comparing_php_script_performance_on_linux_and_windows

E compactar o HTML também ajuda?

http://php.eduardokraus.com/compactando-o-html-de-suas-paginas

Uma coisa que fui descobrir depois de fazer isso é que o uso do ob_start no início do arquivo também melhora a performance. O SO recebe o HTML de uma vês só e não precisa ficar compactando em partes pequenas. Também o Navegador o recebe em um todo e renderiza na tela em um todo, evitando que o faça em partes...

E o CSS?

Compactar o CSS faz com que ele chegue mais rápido até o cliente economizando banda e tempo de espera. http://php.eduardokraus.com/eu-vs-cache-ganhei-a-batalha.

Também estou começando a testar o uso do WEBP e do data-uri em CSS. data-uri para quem não sabe é usar a imagem embed no CSS, evitando uma requisição para cada uma das imagens. Cada requisição ao servidor, mesmo que seja do NGINX usa um pouco de memória, processamento, leitura do disco, etc...

Vale a pena usar WEBP sabendo que hoje só funciona no Chrome?

WEBP é um padrão Google, criado a partir do VP8. Algumas imagens chegam a ficar até 80% menores. Veja este http://www.cidadedesaobonifacio.com.br/img/top-center-bg.jpg.webp (28K) vs este http://www.cidadedesaobonifacio.com.br/img/top-center-bg.jpg (118K)

Sim, hoje mais de 50% dos acessos vem do Chrome e isso significa que 50% dos acessos são respondidos com uso do WEBP. Vale muito a pena, principalmente para quem paga CDN.

E agora?

Agora é a parte que você diz que eu sou louco em ficar calculando milisegundos. Mais de grão em grão a galinha enche o papo e é de milisegundos em milisegundos que eu tenho a economia final.

Banheiros estão vindo com aquela descarga só para xixi que pode não significar muito, mais no fim do mês a soma de tudo é muito. Então cada byte economizado é um byte a menos que precisarei pagar para os provedores, um byte a menos para trafegar, e um byte a menos para ser analisado pelo navegador e impactará em um pentelhésimo de segundo a menos que o browser necessítará para renderizar o site.

Gostou? Não esqueça de curtir!

18 comentários

Deixe uma resposta

  1. Olá, me desculpe a pergunta mas tem certeza que a dica 2 é relevante mesmo? Pergunto porque me parece que se eu incluir um arquivo na página com include/require(_once) o php vai saber onde procurar o arquivo independente da forma de passar o caminho. Se, por exemplo, estou na pasta /server/sp/ssp/sssp/ e dou um require('arq.php'), o php vai saber que esse arquivo está na mesma pasta. Se eu dou um require('../arq.php'), o php vai saber que está um nível acima e se eu botar require('http://www.meusite.com/sp/sp/arq.php'), ele também vai saber onde buscar. Digo porque de todas as formas que eu já testei, sempre vai dar erro se o caminho for passado errado, por exemplo se estiver na sp e eu colocar para procurar na ssp tanto faz se coloco caminho relativo ou absoluto, ou seja, o php vai direto no endereço que botei e se não estiver lá, dá erro. Resumindo, me parece que de qualquer forma, o php não fica caçando o arquivo em todas as pastas e subpastas não. Será que é só uma questão de servidor, de so...?

     
  2. Tenho certeza sim.

    Imagina se alguém disser para você: "Pegue a agenda que esta no quarto." Ai entra na casa e tem 5 quartos. Você vai ter que entrar no primeiro, segundo até achar a agenda. Agora se disser "Pegue a agenda que esta no quarto 3." será mais rápido porque só precisas entrar e procurar no quarto 3.

    No PHP o include_path possui várias pastas e o PHP terá que entrar em casa uma destas pastas e buscar.

     
  3. Muito bom esse artigo. sempre quis deixa minha page full speed e meio complicado , porque coloco anuncios do google ads , atrassa no carregamento da page. sem conta que atrapalha um pouco na estrutura CSS que cria style inline.

     
  4. Seu caso é porque seu topo é muito grande e ocupa mais de 50% da página da maioria dos navegadores.

     
  5. Olá, Eduardo Kraus tudo bem!

    Eu sempre estou lendo seus artigos, mas só me pronuncio em comentários quando tenho dúvidas!

    Lhe admiro como pessoa e profissional.

    Tenho um blog criado em Wordpress e conseguir otimiza-lo seguindo suas dicas. Mas estou com dúvidas em relação a isso aqui » https://developers.google.com/speed/pagespeed/insights/?url=dicasdadisneyeorlando.com.br...

    Gostaria que me indicasse algum plugin ou dicas para chegar a nota 100/100 assim como você alcançou.

    Grato.

     
  6. Com relação ao mais grave dos erros, o "Reduzir o tempo de resposta do servidor", o WP-Cache resolve este item.

    O erro "Eliminar JavaScript e CSS de bloqueio de renderização no conteúdo acima da borda" só manualmente, e é muito trabalhoso.

     
  7. Olá pessoal.
    Estou concluindo meu TCC no curso de Sistemas de Informação pela Universidade do Estado da Bahia.

    Meu trabalho tem como apresentar resultados de comparações feitas em aplicaões desenvolvidas com PHP e HACK.

    Vou deixar um link de um formulário que traz algumas perguntas sobre PHP e HACK onde usarei as respostas como  material para meu trabalho.

    Grato.

    https://docs.google.com/forms/d/1iq5b8YXLXdBO89iOFKU7GtZfXH72gLi17UVqIXW6gkM/viewform?usp=send_form

     
  8. Boa tarde Eduardo,

    Como faz pra usar o echo com mais de um parâmetro? Nesse caso só tem 1

    echo 'A variável seila possui o valor = ', $seila;

     
  9. Tem dois parâmetros.
    String 'A variável seila possui o valor = ' e a variável $seila;

    echo $seila1, $seila2, $seila3, $seila4;

     
  10. Vou perguntar de outra maneira:
    Como faço pra exibir o valor de mais de uma variável com este mesmo método?

     
  11. echo $seila1, $seila2, $seila3, $seila4;

     
  12. Olá Kraus,

    Lembra de mim, vcs vieram aqui no Ipen ministrar um curso de ADOBE CONNECT.
    Preciso muito da sua ajuda sobre o Moodle.
    Sou professor numa Faculdade e uso como apoio, por conta própria mesmo.
    Mas brother, ele está muito lento.
    Me ajuda por favor.

     
  13. se eu utilizar assim:
    echo 'A variável seila possui o valor = {$seila}'

    é considerado uma forma lenta ?

     
  14. echo 'A variável seila possui o valor = {$seila}';

    A saída para esta string será:
    A variável seila possui o valor = {$seila}

    Isso porque o PHP não analisa o que há entre as aspas simples.

     
  15. Nossa muito bacana essas dicas, obrigado !

     
  16. Boa noite Eduardo,

    Post bacana. E tenho uma dúvida, estou com um projeto antigo no php e o acesso a índices de array é realizado da forma array[login] ao invés de array['login'], meu php é o 5.5. Sabe se tem alguma diretiva no php.ini que aceita tal forma de acesso a array ou uma forma simples de alterar em todo projeto php.

    Desde já agradeço qualquer ajuda.

    Atenciosamente.

     
  17. Ótimas Dicas Edauardo.
    Abraços Marcos.