Introdução
O PHP continua sendo uma das linguagens mais populares para desenvolvimento web: WordPress, Laravel, Symfony e milhões de sites rodam nela. No entanto, com o aumento da carga, a performance de aplicações PHP pode se tornar um gargalo. O carregamento lento de páginas não só prejudica a experiência do usuário, mas também reduz as posições nos resultados de busca (o Google considera Core Web Vitals).
Neste artigo, vamos abordar métodos comprovados de otimização PHP que ajudarão a acelerar sua aplicação sem reescrever todo o código. Você aprenderá sobre caching, configuração do interpretador, otimização de banco de dados e profiling.
1. Caching: o primeiro passo para a velocidade
Caching é a forma mais eficaz de reduzir o tempo de resposta. Em vez de executar operações pesadas toda vez, salve o resultado e entregue-o a partir do cache.
1.1. OpCache (PHP 7/8)
PHP é uma linguagem interpretada: a cada requisição, ele compila o script em opcode (bytecode). O OpCache armazena o opcode compilado na memória RAM, eliminando a recompilação repetida. Isso proporciona um ganho de performance de até 30–50%.
Como ativar: Abra o php.ini e certifique-se de que os parâmetros estão configurados:
opcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=10000opcache.revalidate_freq=2Para produção, defina opcache.revalidate_freq=0 e limpe o cache manualmente no deploy.
1.2. Cache de dados (Redis / Memcached)
Se sua aplicação faz consultas caras ao BD ou APIs externas, use armazenamentos in-memory.
Exemplo com Redis:
<?php$redis = new Redis();$redis->connect('127.0.0.1', 6379);
$cacheKey = 'user_profile_' . $userId;$profile = $redis->get($cacheKey);
if (!$profile) { // Consulta cara ao BD $profile = getUserProfileFromDB($userId); $redis->setex($cacheKey, 3600, serialize($profile)); // TTL 1 hora}
$profile = unserialize($profile);1.3. Cache de HTML (Full Page Cache)
Para páginas estáticas ou raramente atualizadas (blog, landing page), você pode armazenar em cache a saída HTML pronta. No Laravel, isso é feito via middleware; no Symfony, via HTTP cache.
2. Otimização de consultas SQL e banco de dados
Na maioria das vezes, o gargalo de uma aplicação PHP é o banco de dados. Consultas lentas consomem recursos do servidor.
2.1. Use índices
Certifique-se de que as colunas usadas em WHERE, JOIN e ORDER BY possuem índices. Você pode verificar isso com EXPLAIN SELECT ....
Consulta ruim (sem índice):
SELECT * FROM orders WHERE status = 'pending';Consulta boa (com índice):
CREATE INDEX idx_orders_status ON orders (status);SELECT * FROM orders WHERE status = 'pending';2.2. Evite consultas N+1
Este é um erro clássico de ORM: obter dados para cada registro dentro de um loop.
Problema (Laravel Eloquent):
$users = User::all();foreach ($users as $user) { echo $user->profile->bio; // uma nova consulta a cada vez}Solução (carregamento ansioso):
$users = User::with('profile')->get();foreach ($users as $user) { echo $user->profile->bio; // uma única consulta}2.3. Paginação em vez de LIMIT com grande deslocamento
Com LIMIT 10 OFFSET 100000, o MySQL ainda percorre 100010 linhas. Use cursor-based pagination (busca por índice):
SELECT * FROM posts WHERE id > $lastId ORDER BY id ASC LIMIT 10;3. Otimização de código e arquitetura
Mesmo com BD e cache ideais, código ruim po