Introdução: por que a velocidade das aplicações PHP é crítica?
Na web moderna, a velocidade de carregamento das páginas afeta diretamente a conversão, as posições de SEO e a experiência do usuário. O PHP, sendo uma linguagem do lado do servidor, frequentemente se torna um gargalo de desempenho. Muitos desenvolvedores acreditam que o PHP é "lento por padrão", mas não é o caso: uma otimização adequada pode acelerar a aplicação em 5 a 10 vezes sem mudar a pilha de tecnologia. Neste artigo, abordaremos técnicas práticas que ajudarão você a extrair o máximo do seu código PHP.
1. Profiling: encontrando gargalos antes da otimização
Antes de otimizar qualquer coisa, é preciso entender o que está causando lentidão. Sem profiling, você corre o risco de passar horas "acelerando" partes insignificantes do código, enquanto o problema real está em outro lugar.
Ferramentas para profiling
- Xdebug + KCacheGrind / WebGrind — conjunto clássico para análise detalhada de chamadas de funções.
- Blackfire.io — profiler profissional com visualização e recomendações.
- PHP Built-in profiler (Tideways, xhprof) — soluções leves para ambiente de produção.
Exemplo: medição básica do tempo de execução
<?php$start = microtime(true);
// Seu código$data = heavyFunction();
$end = microtime(true);echo 'Tempo de execução: ' . round(($end - $start) * 1000, 2) . ' ms';?>Dica: Use memory_get_usage() e memory_get_peak_usage() para monitorar o consumo de memória. Frequentemente, código lento é código que "consome" toda a memória RAM.
2. Cache: a principal ferramenta de aceleração
O cache permite evitar a execução repetida de operações pesadas (consultas ao banco de dados, renderização de templates, cálculos). No PHP, existem vários níveis de cache.
OPcache: cache de opcode
Por padrão, um script PHP é compilado em opcode a cada requisição. O OPcache armazena o código compilado na memória, acelerando a execução em 30-50%.
; php.iniopcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=4000opcache.revalidate_freq=60Cache de dados com Redis / Memcached
Consultas SQL pesadas ou resultados de chamadas de API devem ser armazenados em cache na memória RAM.
<?php$cache = new Redis();$cache->connect('127.0.0.1', 6379);
$key = 'user_profile_' . $userId;$profile = $cache->get($key);
if (!$profile) { $profile = $db->query("SELECT * FROM users WHERE id = ?", [$userId])->fetch(); $cache->setex($key, 3600, serialize($profile)); // Cache por 1 hora}
$profile = unserialize($profile);?>Cache de fragmentos HTML
Para páginas estáticas ou que raramente mudam, é possível armazenar em cache o HTML pronto.
<?php$cacheFile = __DIR__ . '/cache/about.html';if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < 3600)) { readfile($cacheFile); exit;}
ob_start();// ... renderização da página ...$html = ob_get_clean();file_put_contents($cacheFile, $html);echo $html;?>3. Otimização do trabalho com banco de dados
O banco de dados é o "gargalo" mais comum em aplicações PHP. Mesmo um código PHP perfeitamente escrito pode ser lento devido a consultas não otimizadas.
Regras básicas
- Índices: adicione índices nos campos usados em WHERE, JOIN e ORDER BY.
- Problema N+1: use carregamento ansioso (Eager Loading) em vez de carregamento preguiçoso (Lazy Loading).
- LIMIT e OFFSET: em paginação, use paginação baseada em cursor em vez de OFFSET em tabelas grandes.
Exemplo: evitando consultas N+1
<?php// RUIM: N+1 consultas$users = $db->query("SELECT * FROM users"