Quando estamos programando, independentemente da linguagem, existem conceitos e técnicas que podemos adotar para melhorar tanto a legibilidade e o entendimento do código quanto o desempenho da aplicação.
O maior aprendizado aqui é: não tente reinventar a roda. Como eu sempre digo: estude e pesquise. Muito provavelmente, alguém já enfrentou o mesmo problema que você e encontrou uma solução eficiente. Aproveitar o conhecimento acumulado pela comunidade não apenas economiza tempo, mas também ajuda a evitar armadilhas e erros comuns.
Queries e Banco de Dados
Sobre esse assunto, que é muito importante nas aplicações, eu já escrevi um pouco, vale a pena dar uma lida.
Otimizando Persistência e Leitura de dados no MySQL e Aplicação
Técnicas de Otimização de Performance
Além de queries e banco de dados, existem outras áreas fundamentais para otimizar aplicações. Vamos destacar algumas:
Cache
O uso de cache é essencial para reduzir a carga no banco de dados, armazenando temporariamente dados que são acessados frequentemente. A comunidade utiliza amplamente o Redis para esse propósito.
O Redis é um banco de dados NoSQL em memória, altamente performático, mas volátil, já que a memória não é persistente. Ele é ideal para casos como:
- Dados de consumo em tempo real
- Sessões de usuários
- Carrinhos de compra
O Laravel abstrai muito bem o uso do Redis, tanto para cache quanto para outras finalidades. No entanto, use-o com cautela! Realize muitos testes e aprenda sobre técnicas de failover para lidar com possíveis indisponibilidades. Por exemplo, se seu dashboard em tempo real depende do Redis, o que você fará se ele ficar inoperante? Planejar alternativas é crucial.
Otimizações de código
Alguns pontos importante quando falamos sobre otimização de escrita de código:
Loops: Nem sempre substituir for por foreach vai melhorar o desempenho. Embora o código possa ficar mais legível, é essencial testar usando ferramentas como o *Xdebug * ou funções simples como microtime() para validar o impacto real. Preste atenção na manipulação de dados dentro do loop e evite desperdício de memória.
Operações Nativas: Utilizar funções nativas do PHP, como array_map, geralmente é mais seguro e eficiente do que criar soluções personalizadas. Lembre-se: "Não precisa reinventar a roda".
Minimize operações em Loop: Evite criar loops dentro de loops desnecessariamente. Um foreach aninhado pode ser tão prejudicial quanto um
SELECT *
. Em vez disso, considere soluções alternativas, como reescrever a lógica ou usar queries mais eficientes para reduzir a complexidade.PSR (PHP Standards Recommendations): Aderir às práticas da PSR melhora a legibilidade e a manutenção do código. Hoje, IDEs oferecem extensões que automatizam a aplicação desses padrões ao salvar alterações. Isso não apenas ajuda na qualidade do código, mas também facilita a vida de quem dará manutenção no futuro
Filas: O uso de filas (queues) é cada vez mais comum. A ideia é simples: se o processamento de uma tarefa pode ser feito posteriormente, remova-a da execução imediata do método.
Exemplo:
Quando um usuário faz uma compra no e-commerce, é necessário enviar o e-mail de confirmação instantaneamente? Muitas vezes, não. Nesse caso, você pode enviar o e-mail para uma fila, que será processada em lotes, economizando recursos e garantindo escalabilidade.
Sub-Processos: Não é bala de prata, mas dependendo da situação pode ser implementado e vale a pena.
Exemplo:
Imagine uma aplicação responsável por processar centenas de notas fiscais simultaneamente, calculando impostos para cada uma. Se todas essas operações forem realizadas em sequência, você poderá enfrentar alertas de lentidão, mesmo com recursos computacionais sobrando (CPU e RAM).
Nesse caso, subprocessos podem ser uma solução. Divida o processamento em pequenas partes e execute-as em paralelo. Por exemplo, cada subprocesso pode ser responsável por calcular impostos para um grupo de notas fiscais. Isso permite que sua aplicação aproveite melhor os recursos disponíveis, acelere o processamento e evite gargalos.
- Requires e includes: Prefira o uso de autoload para gerenciar carregamento de classes e arquivos. Isso não só melhora o desempenho como evita problemas com classes grandes e desnecessárias (os famosos “megazords”). Por exemplo, carregar uma classe com 7.000 linhas apenas para usar um método que faz um SELECT é extremamente ineficiente. Nessas situações, é importante considerar uma refatoração.
Sobre o megazord, vale a pena um papo sobre Refatoração.
Otimizações de servidor
A primeira coisa que você precisa saber é que o PHP é uma linguagem muito leve. Em condições normais de temperatura e pressão, com uma máquina adequada à quantidade de requisições e com as devidas otimizações no código, tudo tende a funcionar bem.
“Mas Mateus, o que é uma máquina correspondente à quantidade de requisições?”
Já participei da implementação e otimização de aplicações complexas que recebiam mais de 6 milhões de requisições por dia utilizando, em média, duas máquinas com 2 vCPUs e 2 GB de RAM cada.
Agora, falando sobre ferramentas:
PHP-FPM
É um gerenciador de processos FastCGI para PHP, uma alternativa ao módulo PHP do Apache. O PHP-FPM é mais rápido, flexível e amplamente utilizado em produção.OpCache
Um sistema de cache para os scripts PHP. Ele armazena o código PHP pré-compilado na memória, permitindo que o PHP execute com maior rapidez, reduzindo o tempo de execução e o consumo de recursos.Manter as versões atualizadas
É fundamental manter os pacotes, ferramentas, frameworks e a linguagem PHP o mais atualizados possível. Entendo que, muitas vezes, o esforço para migrar de uma versão mais antiga, como o PHP 7.4, para uma mais recente, como o PHP 8.x, pode parecer alto. Porém, os benefícios em termos de desempenho, segurança e suporte valem o esforço.
Cuidados importantes:
Tenha atenção especial à configuração de threads e child processes (processos filhos). Definir valores muito altos para essas configurações ou permitir o uso de arquivos grandes pode sobrecarregar a máquina, levando a falhas e indisponibilidades. Sempre ajuste essas configurações de acordo com a capacidade da máquina e os requisitos reais da aplicação.
Monitoramento
Um dos itens mais importantes quando falamos sobre otimizações é entender o que precisa ser otimizado. Para isso, uma boa ferramenta de monitoramento no nível de APM (Application Performance Monitoring) pode fornecer informações valiosas, além de permitir ações preventivas antes que os problemas se tornem críticos.
Existem várias abordagens para monitoramento, desde a busca manual em logs do PHP até soluções automatizadas. Entre as ferramentas automatizadas, destacam-se:
- New Relic
- DataDog
Essas ferramentas são conhecidas como “plug and play”: basta instalar o agente, reiniciar o serviço e configurar os painéis para criar métricas e alertas.
Por outro lado, existem opções mais manuais que, embora exijam maior esforço e conhecimento da equipe, podem valer a pena dependendo do contexto:
- Prometheus + Grafana
- Elastic Stack
O desafio em utilizar essas ferramentas manuais está na complexidade que elas adicionam, especialmente em aplicações robustas sem um time dedicado para sustentação. Essas soluções demandam muita configuração, testes rigorosos e cuidado para evitar que os agentes impactem negativamente o desempenho. Além disso, elas precisam de camadas e camadas de failover — apenas uma máquina de redundância muitas vezes não é suficiente.
Apesar disso, implementar e testar essas ferramentas pode ser um ótimo desafio para um final de semana!
Na maioria dos casos, ferramentas como o New Relic oferecem um ótimo ponto de partida, proporcionando grande capacidade para prevenir catástrofes. No entanto, é importante ficar atento ao custo, que pode se tornar significativo dependendo do uso.
Top comments (0)