Introdução: Por que a velocidade é importante?
Imagine que seu site demora mais de 3 segundos para carregar. De acordo com o Google, 53% dos usuários o abandonarão e a conversão cairá 20%. Para um desenvolvedor PHP, saber otimizar uma aplicação não é apenas "boa prática", mas uma necessidade. Mesmo que você esteja apenas começando, técnicas básicas de aceleração de código ajudarão você a criar projetos rápidos e responsivos.
Neste artigo, abordaremos 4 direções principais: desde caching e trabalho com bancos de dados até configuração de servidor e profiling. Você receberá exemplos de código prontos e uma checklist para implementação.
1. Caching: salvando o resultado, em vez de recalcular do zero
Caching é como fazer uma "cola" antes da prova. Em vez de calcular dados complexos repetidamente, nós os salvamos em um armazenamento rápido.
1.1. Caching em memória (Memcached / Redis)
Para dados que raramente mudam (como uma lista de categorias ou configurações), o caching em memória RAM é ideal.
<?php// Exemplo com Memcached$memcached = new Memcached();$memcached->addServer('localhost', 11211);
$key = 'categories_list';$categories = $memcached->get($key);
if ($categories === false) { // Dados não estão em cache — obtém do BD $categories = $db->query("SELECT * FROM categories")->fetchAll(); // Salva por 1 hora (3600 segundos) $memcached->set($key, $categories, 3600);}
// Usa $categoriesforeach ($categories as $cat) { echo $cat['name'];}?>1.2. Caching de fragmentos HTML (Output Buffer)
Se você tem blocos pesados (widgets, menus), armazene em cache o HTML pronto.
<?phpfunction getCachedWidget($widgetName, $ttl = 300) { $cacheFile = __DIR__ . '/cache/' . md5($widgetName) . '.html'; if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $ttl) { return file_get_contents($cacheFile); } ob_start(); // Aqui o código que gera o widget echo "<div class='widget'>Conteúdo complexo...</div>"; $html = ob_get_clean(); file_put_contents($cacheFile, $html); return $html;}
echo getCachedWidget('sidebar_menu');?>2. Otimização de consultas ao banco de dados
O gargalo mais comum em aplicações PHP é o banco de dados. Uma única consulta mal feita pode "matar" a performance de todo o site.
2.1. Use índices
Sem um índice, o MySQL é forçado a escanear a tabela inteira. Adicione índices nos campos que participam de WHERE, JOIN e ORDER BY.
-- Ruim: varredura completaSELECT * FROM users WHERE email = 'test@test.com';
-- Bom: usa índiceCREATE INDEX idx_email ON users(email);SELECT * FROM users WHERE email = 'test@test.com';2.2. Evite consultas N+1
Este é um erro clássico: em um loop, você consulta o BD para cada elemento.
<?php// RUIM: N+1 consultas$users = $db->query("SELECT * FROM users")->fetchAll();foreach ($users as $user) { $orders = $db->query("SELECT * FROM orders WHERE user_id = " . $user['id']); // ...}
// BOM: uma única consulta com JOIN$users = $db->query(" SELECT u.*, o.* FROM users u LEFT JOIN orders o ON u.id = o.user_id")->fetchAll();?>2.3. Lazy Loading (Carregamento Preguiçoso)
Não carregue dados que não são necessários agora. Use paginação ou LIMIT.
// Em vez de:$all = $db->query("SELECT * FROM logs"); // 100 000 linhas
// Use:$page = $_GET['page'] ?? 1;$limit = 20;$offset = ($page - 1) * $limit;$logs = $db->query("SELECT * FROM logs LIMIT $limit OFFSET $offset");3. Configuração do servidor e OPcache
Às vezes, o problema não está no código, mas na configuração do PHP. A otimização mais poderosa é