5 Maneiras de Aumentar o PHP Desempenho – Tideways

5 Maneiras de Aumentar o PHP Desempenho

BÔNUS: temos discutido o assunto com um especialista na comunidade PHP no nosso podcast:

Fora do proverbial, caixa, PHP fornece um desempenho decente. No entanto, existem várias coisas que nós, como desenvolvedores PHP e administradores de sistemas, podemos fazer para aumentar ainda mais seu desempenho; às vezes quase sem esforço.

neste post, vou passar por cinco dessas maneiras. No momento em que você terminar de ler, você deve ver pelo menos um aumento notável no desempenho do seu aplicativo PHP. Vamos começar.

use PHP 7

uma das melhores maneiras de melhorar o desempenho do PHP é executar a versão mais recente (PHP 7). Ele oferece uma melhoria significativa da velocidade em relação a qualquer versão anterior. Agora, os resultados sempre variam, pois não há dois aplicativos iguais. No entanto, com base em relatórios de vários desenvolvedores e empresas de hospedagem notáveis, as melhorias de desempenho são significativas.

aqui está uma pequena amostra:

  • os benchmarks oficiais do PHP relatam que o PHP 7 pode executar o dobro de solicitações por segundo quando comparado ao PHP 5.6.
  • os benchmarks de desempenho PHP da Kinsta mostram que o WordPress 5.0 pode executar 3x tantas transações quanto o PHP 5.6; e
  • Pantheon relatou que o PHP 7 deu uma melhoria de 64% em relação à versão 5.3.

se isso não for suficiente para você, verifique seus benchmarks e veja o que eles dizem.Além disso, o PHP 7.0.0 foi lançado em 3 de dezembro de 2015, e a última versão estável, 7.3.6, foi lançada em 30 de maio deste ano.

além disso, a versão final do PHP 5, 5.6, foi EOL (fim da vida útil) há 7 meses, em 31 de Dezembro de 2018. Então, se você ainda não fez isso, já está na hora de fazer a transição para o PHP 7. Faça a atualização e, como Rasmus disse no phpCE 2018, fique verde(er) reduzindo seus custos de hospedagem.

Desinstalar Xdebug

a próxima coisa a verificar é que Xdebug não está instalado em seus servidores de produção. Com certeza, Xdebug é um dos mais sofisticados e abrangentes criadores de perfil e depuradores para PHP, mas nunca deve ser ativado (mesmo instalado) em um servidor de produção, pelo menos até Xdebug 3 é lançado e você deve se juntar a nós no apoio Derick para trabalhar com ele.

embora os benchmarks de desempenho variem (eles sempre variam), um relatório sobre o Stack Overflow mostrou um aumento de desempenho de 50% removendo completamente o Xdebug. Além do mais, é importante notar que, embora o Xdebug tenha sido instalado no servidor — ele nem estava habilitado!

xdebug performance benchmarkxdebug performance benchmark

para verificar se está instalado, execute php -m | grep -i xdebug ou verifique o painel de administração do seu provedor de hospedagem. E se você quiser saber mais sobre como o Xdebug funciona, confira a documentação do Xdebug.

use Composer Optimize Autoloader

embora todos estejamos provavelmente muito familiarizados com o uso do Composer para lidar com o gerenciamento de pacotes para nós, se não considerarmos otimizar a configuração que ele gera, nossos aplicativos não terão o melhor desempenho possível.

aqui está uma citação da documentação do compositor que explica por que:

devido à forma como as regras de carregamento automático PSR-4 e PSR-0 são configuradas, o compositor de TI precisa verificar o sistema de arquivos antes de resolver um nome de classe de forma conclusiva. Isso retarda as coisas um pouco, mas é conveniente em ambientes de desenvolvimento, porque quando você adiciona uma nova classe, ela pode ser imediatamente descoberta/usada sem ter que reconstruir a configuração do autoloader.

para melhorar o desempenho, o Composer oferece três níveis de otimização; estes são:

  • geração de mapas de classe
  • mapas de classe autorizados
  • cache APCu

1: Geração de mapas de classe

esta estratégia converte as regras PSR-4/PSR-0 em regras de mapa de classe. Essa estratégia é mais rápida porque o classmap pode retornar instantaneamente o caminho completo para arquivos conhecidos e evita uma operação de status do sistema de arquivos.

para habilitar esse nível de otimização, execute o seguinte comando:

composer dump-autoload --optimize 

2/A: Mapas de classe autorizados

além de habilitar automaticamente o Nível 1, ao usar esse nível, se uma classe não for encontrada no classmap gerado, o autoloader não tentará procurar o sistema de arquivos de acordo com as regras do PSR-4. Para habilitar esse nível de otimização, execute o seguinte comando:

composer dump-autoload --classmap-authoritative 

2/B: cache APCu

este nível adiciona um cache APCu como um fallback para o mapa de classes. No entanto, ele não gera o classmap. Dado isso, o nível um precisaria ser ativado manualmente. Para habilitar esse nível de otimização, execute o seguinte comando:

composer dump-autoload --apcu 

existem Trade-Offs

embora cada um desses níveis possa melhorar o desempenho do aplicativo, cada um deles tem trade-offs que precisam ser entendidos antes de serem usados. Certifique-se de consultar a documentação do compositor antes de usá-los.

Use um OPcache

como o PHP é uma linguagem interpretada, não compilada, o tempo de execução do PHP precisa converter o código-fonte em código de byte executável, antes que ele possa ser executado. E como o PHP é uma arquitetura compartilhada-nada, esse processo precisa acontecer em cada solicitação.

no entanto, com um cache Opcode (OPcache), esta etapa só precisa acontecer uma vez para cada arquivo, pois os Opcodes gerados podem ser armazenados em cache na memória compartilhada e referenciados lá.Portanto, como você pode imaginar, um OPcache é uma das maneiras menos intensivas de melhorar o desempenho de um aplicativo PHP, porque nenhum código precisa mudar. Alguns relatórios mostram uma melhoria de velocidade de 70%.

houve vários caches Opcode para PHP ao longo dos anos. OPCache (anteriormente Zend Cache) foi empacotado com PHP desde a versão 5.5 — e é ativado por padrão no PHP 7.

para saber mais sobre isso, confira a documentação do OPcache. Para saber mais sobre o OPcache de ajustes de desempenho, confira O excelente artigo de Hayden James, bem como o post de Tideway sobre como ajustá-lo.

Use PHP 7 Preloading

se você não ouviu falar do novo recurso de pré-carregamento do PHP 7.4, ainda assim, é muito legal! Em poucas palavras, o recurso leva a funcionalidade Opcache mais longe do que nunca.

para recapitular rapidamente, a primeira vez que um arquivo de origem PHP é encontrado, ele deve ser analisado e compilado em bytecode dependente da máquina, antes que o mecanismo Zend possa executá-lo. Os Opcaches reduzem significativamente a sobrecarga desse processo, pois após a primeira vez que o código-fonte é analisado e compilado, os bytecodes são armazenados em um cache de Opcode na memória compartilhada.

da próxima vez que uma solicitação para esse arquivo for encontrada, o PHP verifica se o cache do Opcode possui bytecodes para o arquivo. Se isso acontecer, eles serão devolvidos e usados. Se não (ou se o arquivo de origem foi alterado desde que os bytecodes foram compilados), o arquivo de origem é analisado, compilado e armazenado em cache. Isso dá um notável impulso de desempenho ao PHP.

agora, vamos ver como o pré-carregamento funciona. Para citar a implementar RFC:

Na inicialização do servidor – antes de qualquer aplicação de código é executado – nós podemos carregar um determinado conjunto de arquivos PHP na memória – e tornar o seu conteúdo “permanentemente disponível para todas as solicitações subseqüentes, que será servido pelo servidor. Todas as funções e classes definidas nesses arquivos estarão disponíveis para solicitações fora da caixa, exatamente como entidades internas. O pré-carregamento garante que:

  • todas as funções e a maioria das classes, definidas nesses arquivos, serão permanentemente carregadas nas tabelas de função e classe do PHP e ficarão permanentemente disponíveis no contexto de qualquer solicitação futura.
  • PHP resolve dependências de classe e links com pai, interfaces e traços (algo que não acontece com o Cache Opcode).
  • PHP remove desnecessários inclui e executa outras otimizações.

tendo o código para um aplicativo inteiro, incluindo sua estrutura (como Zend Expressive, Symfony e Laravel) pré-carregada na memória, código que só mudou na reinicialização do servidor, a maioria dos aplicativos terá um desempenho significativamente melhor.

dito isso, o pré-carregamento tem algumas desvantagens potenciais que você deve conhecer:

  • uma reinicialização do servidor é necessária quando os arquivos de origem mudam.
  • o pré-carregamento não funcionará em ambientes de hospedagem compartilhada.
  • o pré-carregamento não funcionará quando houver várias versões do mesmo aplicativo.

o pré-carregamento não é mágico. Tanto o seu código quanto os processos de implantação terão que ser refatorados para aproveitá-lo. Por exemplo, alguém terá que desenvolver um script de carregador personalizado para determinar quais arquivos carregar na inicialização do servidor e esse script terá que ser executado na inicialização do servidor. Independentemente disso, é uma melhoria significativa, vale a pena investir!

Use um perfilador

agora para uma opção que terá um pouco mais de trabalho do que qualquer um dos cinco anteriores. Muitas vezes, entramos e tentamos adivinhar onde estão os gargalos de desempenho em nossas aplicações, usando intuição e suposições educadas.

embora possam funcionar, elas não são as abordagens mais eficientes. Em vez disso, podemos usar profilers de código para analisar nosso código e mostrar onde estão os gargalos. Especificamente, eles ajudam a responder a perguntas como as seguintes:

  • quantas vezes cada método foi chamado?
  • qual foi o tempo máximo de execução de cada método?
  • qual foi o tempo médio de execução de cada método?
  • quantas vezes um arquivo foi incluído?
  • que caminho uma solicitação percorreu por meio de um aplicativo (do primeiro ao último arquivo de código)?

ao perfurar os resultados de um perfilador, muitas vezes você pode ser agradavelmente surpreendido, embora mais provavelmente chocado, ao descobrir que seu aplicativo está executando caminhos de código e classes que você nunca esperava.

com base nas informações do relatório do profiler, você e sua equipe podem começar a entender melhor o que seu aplicativo está fazendo e fazer refatorações informadas para alterá-lo, conforme e onde necessário.

se você está apenas começando a criar perfis, existem várias opções disponíveis para PHP. Os mais utilizados são:

  • Xdebug do profiler
  • Tideway do XHProf extensão (& XHGui)
  • spx Profiler
  • forp

Conclusão

E estes são os cinco maneiras de melhorar a qualidade de suas aplicações PHP, nomeadamente. Qualquer um deles por conta própria fornecerá uma melhoria de desempenho notável. No entanto, quando usado em conjunto, você deve esperar ver um desempenho significativo, para não mencionar a qualidade, melhoria.

Leave a Reply