Introdução
O desempenho de aplicações PHP é um dos principais fatores de sucesso para qualquer projeto web. Um site lento não apenas afasta usuários, mas também impacta negativamente o ranking de SEO. Neste artigo, abordaremos os principais métodos para otimizar o código PHP e a infraestrutura do servidor que ajudarão a acelerar sua aplicação.
A otimização não é uma ação única, mas um processo contínuo. Vamos começar com as técnicas mais eficazes que proporcionam o maior ganho de desempenho.
1. Cache de Dados
O cache é uma das ferramentas mais poderosas para acelerar aplicações PHP. Em vez de gerar uma resposta do zero toda vez, você pode salvar o resultado e servi-lo a partir do cache.
1.1. Cache em Memória (Redis/Memcached)
Use sistemas de cache em memória como Redis ou Memcached. Eles são ideais para armazenar resultados de consultas complexas, sessões e dados frequentemente solicitados.
<?php// Example of using Redis for caching$redis = new Redis();$redis->connect('127.0.0.1', 6379);
$cacheKey = 'user_profile_' . $userId;$profile = $redis->get($cacheKey);
if ($profile === false) { // Data not in cache — execute heavy query $profile = getUserProfileFromDatabase($userId); $redis->setex($cacheKey, 3600, serialize($profile)); // Cache for 1 hour}
$profile = unserialize($profile);?>1.2. Cache de Saída HTML (Full Page Cache)
Para páginas estáticas ou páginas que raramente mudam, use o cache do HTML pronto. Isso pode ser implementado usando Varnish ou cache incorporado em frameworks populares (ex: Symfony HTTP Cache).
2. Otimização de Banco de Dados
O banco de dados frequentemente se torna um gargalo. Otimizar consultas e a estrutura do banco de dados pode proporcionar um grande ganho de velocidade.
2.1. Use Índices
Certifique-se de que todas as colunas envolvidas em condições WHERE, JOIN e ORDER BY tenham índices. Isso acelera a busca dezenas de vezes.
2.2. Otimização de Consultas com EXPLAIN
Antes de executar uma consulta complexa, use o comando EXPLAIN para entender como o MySQL a executa. Procure por "Using filesort" ou "Using temporary" — estes são sinais de uma consulta não otimizada.
<?php// Bad: N+1 queries$users = $db->query("SELECT * FROM users");foreach ($users as $user) { $posts = $db->query("SELECT * FROM posts WHERE user_id = " . $user['id']); // ...}
// Good: single query with JOIN$users = $db->query(" SELECT u.*, p.title as post_title FROM users u LEFT JOIN posts p ON p.user_id = u.id");?>2.3. Paginação em Vez de LIMIT com Grande Offset
Usar LIMIT com um grande OFFSET força o banco de dados a escanear muitas linhas. Use paginação baseada em cursor (WHERE id > last_id).
<?php// Bad: LIMIT 100000, 20$stmt = $db->query("SELECT * FROM articles ORDER BY id LIMIT 100000, 20");
// Good: cursor-based pagination$lastId = $_GET['last_id'] ?? 0;$stmt = $db->query("SELECT * FROM articles WHERE id > $lastId ORDER BY id LIMIT 20");?>3. Usando OPcache e Autoloading de Classes
PHP é uma linguagem interpretada, e cada requisição exige a compilação do script. O OPcache resolve esse problema armazenando o código compilado na memória.
3.1. Configurando OPcache
Certifique-se de que o OPcache está habilitado e configurado corretamente. Aqui estão os parâmetros ideais para a maioria dos projetos:
; php.iniopcache.enable=1opcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=10000opcache.revalidate_freq=2opcache.fast_shutdown=13.2. Autoloading de Classes Adequado
Use o Composer para autoloading de classes. Isso permite carregar apenas as classes que são