php papa-léguas: performance em php

78
PHP Papa-Léguas: Performance em PHP Flávio Gomes da Silva Lisboa www.fgsl.eti.br @fgsl

Upload: flavio-lisboa

Post on 24-May-2015

1.364 views

Category:

Documents


2 download

DESCRIPTION

Palestra sobre performance de aplicações PHP. Proferida na PHP Conference Brasil 2011.

TRANSCRIPT

Page 1: PHP Papa-Léguas: Performance em PHP

PHP Papa-Léguas: Performance em PHP

Flávio Gomes da Silva Lisboawww.fgsl.eti.br

@fgsl

Page 2: PHP Papa-Léguas: Performance em PHP

Quem sou eu

Analista do Serviço Federal de Processamento de Dados, instrutor e consultor independente.

Evangelista PHP, especialista em arquitetura de software e contribuidor oficial do projeto Tine 2.0.

Page 3: PHP Papa-Léguas: Performance em PHP

Palestra-Bússola

Cadê o guincho que não chega?

Page 4: PHP Papa-Léguas: Performance em PHP

Inspiração

Page 5: PHP Papa-Léguas: Performance em PHP

Viagem Conceitual

Um momento para estabelecer um ponto de intersecção: Entre o que você quer e o que você precisa Entre o que você acredita ser importante e o

que é realmente importante Entre o que você pretende alcançar e suas

consequências.

Page 6: PHP Papa-Léguas: Performance em PHP

Por que o Papa-Léguas?

Page 7: PHP Papa-Léguas: Performance em PHP

Por que o Coiote nunca pega o Papa-Léguas?

Culpa do mau funcionamento dos produtos ACME?

Culpa dos planos malfeitos do Coiote? O Papa-Léguas tem poderes sobrenaturais que

o fazem realmente muito, muito rápido? O Coiote tem muito, muito azar?

Page 8: PHP Papa-Léguas: Performance em PHP

Não complique...

Page 9: PHP Papa-Léguas: Performance em PHP

Desfaça-se do desnecessário

Page 10: PHP Papa-Léguas: Performance em PHP

Mas cuidado!

Page 11: PHP Papa-Léguas: Performance em PHP

Lições pós Pearl Harbor

7 de dezembro de 1941

Page 12: PHP Papa-Léguas: Performance em PHP

poder de manobra, alcance e razão de subida inigualáveis por qualquer caça ocidental, tanto de terra quanto embarcado

Mitsubishi A6M2 Zero

Page 13: PHP Papa-Léguas: Performance em PHP

Mas como?!

Page 14: PHP Papa-Léguas: Performance em PHP

privado de blindagem em relação à cabine do piloto e ao tanque de combustível

Page 15: PHP Papa-Léguas: Performance em PHP

Ataque Doolitle - 1942

Page 16: PHP Papa-Léguas: Performance em PHP

Ataque Doolitle - 1942

Primeiro ataque aéreo dos Estados Unidos às ilhas japonesas, 4 meses

após o ataque a Pearl Harbor

Page 17: PHP Papa-Léguas: Performance em PHP

Remoção da torre de armas inferior Remoção do aparelho de rádio Substituição da mira Norden por uma mira

improvisada, concebida pelo piloto Capitão Ross C. Greening e chamada de "Mark Twain" com materiais que custavam 20 centavos.

Mas como?!

Page 18: PHP Papa-Léguas: Performance em PHP

Ataque Doolitle - 1942

Todos os aviões caíram após o ataque.De 80 tripulantes:●3 morreram no ataque●8 foram capturados, sendo que 3 morreram executados e 1 por doença●O resto se refugiou na China.

Page 19: PHP Papa-Léguas: Performance em PHP

O equilíbrio entre

performance e segurança

é fundamental

Page 20: PHP Papa-Léguas: Performance em PHP

Fatos

PHP raramente é o gargalo. 80-90% do problema está no frontend. PHP está no backend. Mas você também pode acelerar os 20-10%.

Page 21: PHP Papa-Léguas: Performance em PHP

Primeiro, os 80-90%

Mausoléu dos Carrapatos

Page 22: PHP Papa-Léguas: Performance em PHP

Google, 09/04/2010

"Acelerar websites é importante - não apenas para os proprietários do site, mas para todos os usuários da Internet. Sites mais rápido fazem usuários felizes e nós temos visto em nossos estudos internos que quando um site responde lentamente, visitantes gastam menos tempo lá. Mas os sites mais rápidos não apenas melhoram a experiência do usuário; dados recentes mostram que a velocidade do site também melhorar reduz os custos operacionais. Como nós, nossos usuários dão muito valor à velocidade - é por isso que nós decidimos levar em conta a velocidade do site em rankings de pesquisa. Usamos uma variedade de fontes para determinar a velocidade de um site em relação a outros sites. "

Page 23: PHP Papa-Léguas: Performance em PHP

Falando em Google...

Page Speed é um complemento de código aberto para o Firefox/Firebug. Webmasters e desenvolvedores da web podem usá-lo para avaliar o desempenho de suas páginas web e receber sugestões sobre como melhorá-las.

Está disponível no Google Code:

http://code.google.com/intl/pt-BR/speed/page-speed

Page 24: PHP Papa-Léguas: Performance em PHP

E também tem o YSlow

Page 25: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

A resposta HTTP geralmente é um arquivo

Page 26: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

1ª: Minimize as requisições HTTP

Page 27: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

80-90% do tempo gasto na resposta ao usuário é no download de todos os componentes da página: imagens, CSS, Javascript, Flash, etc.

Fato: esses componentes são estáticos. Ao invés de começar com a difícil tarefa de

redesenhar a arquitetura de aplicativos, é melhor primeiro dispersar seu conteúdo estático.

A proximidade do usuário com seu servidor tem impacto no tempo de resposta.

Page 28: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

2ª: Utilize uma rede de entrega de conteúdo (CDN)

Page 29: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

Como funciona?

A escolha do servidor que irá entregar conteúdo para um usuário específico normalmente é baseada em uma medida de proximidade de rede. Por exemplo, o servidor com o menor número de pontos de transição de rede ou o servidor com menor tempo de resposta.

Page 30: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

3ª Use GZip

Desde HTTP/1.1, os clientes Web indicam suporte para a compressão com o cabeçalho Accept-Encoding na solicitação HTTP.

       Accept­Encoding: gzip, deflate

Se o servidor web vê este cabeçalho na requisição, pode comprimir a resposta usando um dos métodos listados pelo cliente. O servidor web notifica o cliente web sobre isso via cabeçalho Content-Encoding na resposta.

       Content­Encoding: gzip

Page 31: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

4ª Coloque as folhas de estilo no cabeçalho da página

Porque?

Porque assim a página é renderizada progressivamente e o usuário não fica vendo uma tela em branco.

Porque a especificação HTML diz pra fazer assim.

Page 32: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

5ª (Polêmica) Coloque os scripts no final da página.

Porque?

Scripts bloqueiam downloads paralelos.

A especificação HTTP/1.1 sugere que o browser não faça download de mais de dois componentes em paralelo por endereço.

Enquanto um script está sendo descarregado, o browser não pode iniciar outros downloads, mesmo que sejam de diferentes endereços.

Page 33: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

6ª Evite expressões CSS. Se não sabe o que é isso, esqueça, você é feliz.

Era uma vez um navegador chamado Internet Explorer. Em sua versão 5 seus projetistas inventaram um modo de permitir que você usasse expressões Javascript em uma propriedade CSS. Parecia uma ideia fenomenal até que perceberam que as expressões eram avaliadas não somente quando a página era carregada, mas quando era redimensionada, rolada e quando o usuário passava o mouse sobre ela. Um movimento com o mouse poderia gerar mais de 10 mil avaliações, que consomem tempo de processamento no frontend.

Page 34: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

6ª Evite expressões CSS.

Ao perceber o efeito Ravena, os projetistas decidiram tornar essa característica obsoleta a partir da versão 8.

Page 35: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

7ª Coloque Javascript e CSS em arquivos externos

Usar arquivos externos produz páginas mais rápidas porque o Javascript e CSS são cacheados pelo browser.

Se você usar Javascript e CSS enxertados nos documentos HTML, eles serão descarregados a cada requisição do documento HTML.

Bibliotecas Javascript como Dojo Toolkit ajudam a remover o Javascript remanescente dos documentos HTML.

Page 36: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

8ª Reduza a pesquisa de DNS

O sistema de nomes de domínios mapeia endereços legíveis para endereços IP. Segundo o Yahoo!, um DNS resolver leva de 20 a 120ms para pesquisar o IP de um domínio. Enquanto a pesquisa não for completada, o browser não pode descarregar mais nada.

Mas se você usar somente um domínio, reduzirá a quantidade de downloads paralelos que podem ocorrer na página.

A recomendação Yahoo! é não ter mais de quatro domínios em seu site, para estabelecer o melhor compromisso entre um número reduzido de pesquisas DNS e uma quantidade suficiente de downloads paralelos.

Page 37: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

9ª Minifique Javascript e CSS

O tempo de carga de uma página pode ser reduzido se a quantidade de texto Javascript e CSS que trafegarem pela rede for reduzida.

Minificar é uma prática que consiste em remover caracteres que tornam o texto compreensível para um ser humano, mas que não fazem a menor diferença para o browser. Segundo o Yahoo!, a minificação pode reduzir em até 21% o conteúdo original.

Minificar não é comprimir. A minificação pode reduzir ainda mais a quantidade de dados trafegados.

Page 38: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

10ª Evite usar redirect

Quando se usa redirect, um tempo de espera é introduzido pois nada pode ser renderizado até que a página solicitada pelo redirecionamento seja devolvida pelo servidor. Isso pode implicar em uma tela em branco por tempo suficiente para desagradar o usuário.

Se você precisa fazer redirecionamento, pode usar recursos do servidor, como Alias e mod_rewrite, do Apache. Ambos fazem mapeamento de endereços virtuais para recursos reais.

Page 39: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

11ª Remova scripts duplicados

O número de scripts e o tamanho da equipe de desenvolvedores pode implicar na existência de scripts duplicados. Não é algo intencional, mas se depender apenas do controle humano, pode fatalmente acontecer.

Scripts replicados implicam em requisições replicadas. Ou seja, uma requisição desnecessária é feita, porque ela já foi atendida pelo primeiro “clone” do script.

Page 40: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

12ª Avalie se o uso de ETags é necessário

Entity Tags é um mecanismo de validação de cache do HTTP que cria um código baseado no estado de um conteúdo (Javascript, CSS, imagem, etc) para saber se o que está no servidor é diferente do que está no cache.

O problema é que se você usar múltiplos servidores, ETags pode gerar códigos de verificação diferentes para o mesmo conteúdo, recuperado a partir de servidores diferentes. Ou seja, requisições desnecessárias podem ser feitas.

Page 41: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

13ª Otimize as respostas AJAX

AJAX é Asynchronous Javascript and XML e não Instantaneous Javascript and XML.

Todas as orientações anteriores podem ser aplicadas para respostas AJAX.

Page 42: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

15ª Use GET para requisições AJAX

O Yahoo! descobriu que o método POST do objeto XMLHttpRequest é implementado nos browsers como um processo em duas etapas. Primeiro ele envia o cabeçalho, depois os dados.

Se você não precisar mandar mais de 2K de dados, pode usar GET, que usa apenas um pacote TCP para ser enviado (exceto se houver muitos cookies).

Page 43: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

16 ª e 17ª Componentes Précarregados e Pós carregados

Precarregar componentes significa aproveitar o momento em que o browser está desocupado para requisitar componentes que serão necessários no futuro.

Poscarregar componentes significa verificar o que não é imediatamente necessário na página e deixar por último. Por exemplo, imagens e scripts de drag and drop.

Page 44: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

18 ª Reduza o número de elementos DOM

Uma árvore DOM complexa significa mais bytes para serem carregados pelo browser.

Corte o que não é necessário.

A homepage do Yahoo!, para uma referência, tem menos de 700 elementos.

O número de elementos DOM pode ser obtido com o seguinte Javascript:

document.getElementsByTagName('*').length

Page 45: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

19 ª Divida os componentes entre domínios

Para maximizar a quantidade de downloads paralelos, você pode ter mais de um domínio. Mas não esqueça da regra nº8.

Page 46: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

20 ª Minimize (ou remova) os iframes

Contras do iframe

O documento a ser inserido no atual é procurado e mesmo que esteja em branco, desperdiçará uma requisição e uma resposta.

A montagem do iframe bloqueia o carregamento da página.

Page 47: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

21 ª Acabe com os erros 404 do HTTP

Erro 404 é “página não encontrada”

Não parece um problema de performance? Pois o usuário irá lhe dizer quanto tempo ele perdeu até saber o que fazer após levar um “Page Not Found” na cara.

Page 48: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

22 ª Reduza o tamanho dos cookies

Elimine cookies desnecessários.

Reduza o tamanho dos cookies.

Configure uma data de expiração apropriada.

Page 49: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

23ª Use domínios sem cookie para componentes

Quando o browser requisita uma imagem e ela envia cookies junto, o servidor não os usa pra nada. Assim eles só criam tráfego de rede.

Crie um subdomínio livre de cookies, e hospede todos os componentes estáticos lá.

Page 50: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

24ª Reduza o acesso à arvore DOM

Uma interface com o usuário rica oferece uma ao usuário uma experiência agradável, mas se você exagerar no dinamismo, vai introduzir lentidão ao acessar a árvore DOM muitas vezes.

Verifique também os métodos de pesquisa dos nós, para utilizar as alternativas que tenham o melhor desempenho. Bibliotecas Javascript oferecem APIs que tem desempenho superior aos recursos equivalentes no Javascript padrão.

Page 51: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

25ª Desenvolva manipuladores de evento inteligentes

Javascript suporta a propagação de eventos. Isso significa que um se um evento ocorrer para um elemento que não tem manipulador de eventos, será tratado pelo manipulador de eventos do nó pai.

Dessa forma, se existirem eventos que serão disparados independente do elemento, você pode associar o evento apenas ao nó pai. Por exemplo, uma determinada função é executada para qualquer botão dentro de uma divisão de página. Associe o evento à divisão e não a cada botão.

Page 52: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

26ª Escolha <link> em vez de @import

Segundo o Yahoo!, no IE, o @import tem o mesmo efeito de colocar <link> no final da página.

27ª Evite o Filtro AlphaImageLoader

Segundo o Yahoo!, esse filtro, disponível apenas nas versões do IE < 7, bloqueia a renderização da página e trava o browser enquanto a imagem está sendo descarregada.

Page 53: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

28ª Otimize as imagens

29ª Otimize a forma como o CSS dispõe as imagens

30ª Não use imagens maiores do que você precisa

Se você vai mostrar uma imagem com um tamanho de 100X100px, não precisa pegar uma imagem de 500X500px e redimensionar. Use uma imagem com o tamanho que você irá utilizar.

Page 54: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

31ª Faça o favicon.ico ficar bem pequeno Este é o ícone que aparece na barra de endereços do

navegador. Você precisa dele porque se o browser procurá-lo e não achar, irá receber um erro HTTP 404.

32ª Mantenha os componentes abaixo de 25K Esta é uma restrição do Iphone.

33ª Empacote os componentes em um documento multi-partes.

Isso permite que vários arquivos sejam recuperados com uma única requisição HTTP.

Page 55: PHP Papa-Léguas: Performance em PHP

Regras Yahoo! para Alta Performance

34ª Evite tags <img> com atributo src vazio O browser tenta fazer uma requisição do mesmo jeito.

Será que esse frontend não termina

nunca?

Page 56: PHP Papa-Léguas: Performance em PHP

Agora, os 10-20%

Page 57: PHP Papa-Léguas: Performance em PHP

By Man

uel L

emos

2 ideias são especificamente sobre performance

Page 58: PHP Papa-Léguas: Performance em PHP

PHP não é uma linguagem compilada (MITO)

“PHP não é uma linguagem interpretada desde o PHP 4, que foi lançado no ano de 2000.

Quando um script PHP é executado pela primeira vez, o código-fonte PHP é compilado pelo motor Zend em representações binárias chamadas opcodes. Estes opcodes são armazenados na área de memória compartilhada do servidor. Em seguida, são executados.”

Então, PHP é uma linguagem compilada como Java, C # e outras. Caso contrário, seria bastante lento.

ML

Page 59: PHP Papa-Léguas: Performance em PHP
Page 60: PHP Papa-Léguas: Performance em PHP

Você pode usar ofuscadores para gravar opcodes compilados em arquivos e distribuir a aplicação sem o código-fonte.

E ainda tem mais!

Page 61: PHP Papa-Léguas: Performance em PHP

E ainda mais rápido!

Você pode compilar o PHP gerando código nativo da máquina onde será executado. Roadsend PHP (GPL) PHC PHP Open Source compiler HipHop for PHP (PHP/Zend)

Page 62: PHP Papa-Léguas: Performance em PHP

PHP não é bom para web sites ou aplicações escaláveis de alto desempenho

“...desempenho e escalabilidade não são uma questão de linguagem, mas sim uma questão de arquitetura de aplicação”.

“A maioria das aplicações Web não fazem uso intensivo da CPU. Por exemplo, uma das atividades que as aplicações Web gastam a maior parte do tempo é o acesso a bancos de dados”.

ML

Page 63: PHP Papa-Léguas: Performance em PHP

Arquitetura

PHP é como tijolinhos da LEGO. Tijolinhos da LEGO permitem que você construa

qualquer coisa.

Page 64: PHP Papa-Léguas: Performance em PHP

Arquitetura

Mas PHP não é um brinquedo. Nós o usamos para construir “prédios” de verdade.

Page 65: PHP Papa-Léguas: Performance em PHP

Não faça de qualquer jeito

Page 66: PHP Papa-Léguas: Performance em PHP

Por favor!

Page 67: PHP Papa-Léguas: Performance em PHP

PHP é rápido...

Page 68: PHP Papa-Léguas: Performance em PHP

Como frear o PHP?

Carregue arquivos sem precisar Não use cache Consulte o banco sem necessidade Não otimize o banco de dados Não faça processamento paralelo

Page 69: PHP Papa-Léguas: Performance em PHP

Carregamento de Arquivos

Otimize o carregamento de arquivos. Só carregue quando precisar. Seja brasileiro e

deixe tudo para a última hora. Estabeleça ou adote convenções para acelerar

a busca pelos arquivos.

Page 70: PHP Papa-Léguas: Performance em PHP

Consulta ao banco sem necessidade

Se existe informação frequentemente pesquisada no banco de dados que não muda, verifique se ela não pode ficar em outro lugar:

Arquivos de metadados. Camada de modelo da aplicação.

Frameworks ajudam nisso.

Page 71: PHP Papa-Léguas: Performance em PHP

Otimize o banco de dados

Page 72: PHP Papa-Léguas: Performance em PHP

Cache

É mais rápido pegar o que está por perto. Sugestão: Memcached

Escalável: fácil adicionar máquinas e instâncias RAM é muito mais rápido que I/O em disco Alivia a carga do banco de dados Muito flexível: pode armazenar qualquer dado, desde

que não ultrapasse 1 MB Biblioteca client disponível em PHP Open Source

Page 73: PHP Papa-Léguas: Performance em PHP

Processamento Paralelo

Sugestão: Gearman Framework genérico para distribuir jobs a serem

executados por uma ou mais máquinas Permite uma aplicação executar tarefas em

paralelo, com balanceamento da carga de processos, e até invocar códigos escritos em outras linguagens.

O nome é um anagrama para "Manager" Criado pela Danga Interactive. Open Source, rápido, escalável, tolerante a falhas,

síncrono ou assíncrono.

Page 74: PHP Papa-Léguas: Performance em PHP

Faltou alguma coisa?

Page 75: PHP Papa-Léguas: Performance em PHP

Você utiliza metodologias ágeis para desenvolver?

Uma das orientações de um processo de desenvolvimento ágil e ter entregas curtas. Você não espera até o sistema inteiro estar pronto para entregá-lo (e se frustrar com as negativas do cliente).

Isso é bom porque além de verificar constantemente os requisitos, também mostra para o cliente que o trabalho está sendo realizado, e em que estágio se encontra.

Page 76: PHP Papa-Léguas: Performance em PHP

Mas o que isso tem a ver com desempenho?

Você quer que o usuário fique frustrado e furioso na expectativa de que a página em branco seja substituída por alguma informação, ou quer deixá-lo mais tranquilo, mostrando que a página será montada?

Page 77: PHP Papa-Léguas: Performance em PHP

Olha a Regra Yahoo para Alta Performance que ficou faltando!

14ª Libere o buffer no início

Quando você requisita uma página, pode levar de 200 a 500ms para o backend montá-la e enviá-la.

PHP tem a função flush() que permite que você envie parcialmente uma resposta HTML para o browser.

Assim, o servidor pode ir enviando a página conforme ela vai sendo montada.

Page 78: PHP Papa-Léguas: Performance em PHP

Referências

http://www.slideshare.net/eminetto/ao-infinito-e-alm-com-php-memcached-e-gearman

http://www.slideshare.net/ijansch/enterprise-php-288851

http://talks.php.net/show/digg

www. fgsl.eti.br