Cache em PHP: Redis e outras ferramentas
Cache é um dos mecanismos-chave para otimizar o desempenho de aplicações web em PHP. Um cache configurado corretamente pode reduzir o tempo de resposta do servidor em 10 a 50 vezes, diminuir a carga no banco de dados e reduzir o consumo de recursos. Neste artigo, abordaremos quatro abordagens principais para cache em PHP: Redis, Memcached, APCu e o clássico cache de arquivos.
Por que o cache é necessário em PHP?
Sem cache, cada requisição PHP pode executar dezenas de consultas SQL, processar templates e carregar dados externos. O cache salva o resultado de uma operação custosa (por exemplo, uma consulta ao banco de dados ou parsing de XML) e o entrega diretamente, evitando recálculos. Principais cenários de uso:
- Cache de resultados de consultas SQL — salvar o resultado de uma consulta SELECT por 5 a 60 segundos.
- Cache de fragmentos HTML — blocos prontos de menu, widgets, breadcrumbs.
- Cache de sessões — armazenar dados de sessão no Redis em vez de arquivos.
- Cache de dados de API — respostas de serviços externos (clima, taxas de câmbio).
- Cache de opcode — acelerar a execução do próprio código PHP (OPcache).
1. Redis — o rei do cache in-memory
Redis é um armazenamento de dados in-memory do tipo chave-valor de alto desempenho, com suporte a estruturas complexas (listas, hashes, conjuntos). Para PHP, existem vários clientes: predis/predis (PHP puro) e ext-redis (extensão C).
Exemplo de instalação via Composer:
composer require predis/predisExemplo básico de cache com Redis:
<?phprequire 'vendor/autoload.php';
use Predis\\Client;
$redis = new Client([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379,]);
$cacheKey = 'user_list_page_1';$ttl = 300; // 5 minutos
// Tentar obter dados do cacheif ($redis->exists($cacheKey)) { $data = unserialize($redis->get($cacheKey)); echo "Dados do cache";} else { // Operação custosa (ex.: consulta SQL) $data = getUsersFromDatabase(1, 20); $redis->setex($cacheKey, $ttl, serialize($data)); echo "Dados do BD";}
print_r($data);Vantagens do Redis: velocidade (milissegundos), suporte a TTL, operações atômicas, Pub/Sub, persistência em disco. Desvantagens: requer um servidor separado, consumo de memória RAM.
2. Memcached — simplicidade e velocidade
Memcached é outro armazenamento in-memory popular, mas sem estruturas de dados complexas. Em PHP, usa-se a extensão memcached (observe a letra d — é a versão mais recente).
Instalação da extensão:
sudo apt install php-memcachedExemplo de trabalho com Memcached:
<?php$memcached = new Memcached();$memcached->addServer('127.0.0.1', 11211);
$key = 'article_42';$data = $memcached->get($key);
if ($memcached->getResultCode() === Memcached::RES_NOTFOUND) { $data = fetchArticleFromDB(42); $memcached->set($key, $data, 3600); // 1 hora echo "Consulta ao BD";} else { echo "Do cache Memcached";}Quando escolher Memcached: se você precisa de cache simples de strings sem estruturas complexas e não quer configurar persistência. Memcached é mais rápido que Redis em operações simples de get/set, mas perde em funcionalidade.
3. APCu — cache diretamente no PHP
APCu (Alternative PHP Cache) é uma extensão para cache de dados na memória compartilhada do processo PHP atual. Não requer um servidor separado