Cache em PHP: Redis, Memcached e soluções integradas — acelerando aplicações web
Cada desenvolvedor PHP enfrenta problemas de desempenho: o banco de dados responde lentamente, as páginas demoram a carregar e o servidor fica sobrecarregado. A solução para esses problemas está no cache adequado. Neste artigo, vamos abordar três principais abordagens para cache em PHP: mecanismos integrados (APCu, OpCache), servidores externos Memcached e Redis. Você aprenderá quando escolher cada ferramenta e obterá exemplos de código prontos para implementação.
1. Soluções integradas: OpCache e APCu
Vamos começar pelo mais simples — cache no nível do motor PHP. Aqui destacamos dois componentes principais.
1.1. OpCache (cache de opcode do PHP)
O OpCache está integrado ao PHP desde a versão 5.5. Ele armazena em cache o bytecode compilado (opcode) dos scripts PHP. Sem ele, cada requisição precisa analisar e compilar o código-fonte novamente — um desperdício de recursos. Ativar o OpCache proporciona um ganho de velocidade de 30 a 50% sem uma única linha de código.
Configuração no php.ini:
opcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=4000opcache.revalidate_freq=601.2. APCu (Alternative PHP Cache user)
APCu é um cache para dados do usuário (variáveis, resultados de cálculos). Ele opera na memória RAM e é ideal para armazenar dados pequenos e frequentemente solicitados: configurações, traduções, resultados de consultas SQL simples.
Exemplo de uso do APCu:
<?php// Salva dados no cache por 300 segundosapcu_store('site_config', $config, 300);
// Obtém dados do cache$cached = apcu_fetch('site_config');if ($cached === false) { // Dados não encontrados — carrega e salva $cached = loadConfigFromDB(); apcu_store('site_config', $cached, 300);}
// Remove a chaveapcu_delete('site_config');?>Vantagens: não requer serviços externos, fácil de configurar, latência mínima. Desvantagens: funciona apenas em um único servidor, os dados são perdidos ao reiniciar o PHP-FPM.
2. Memcached — cache distribuído para dados simples
Memcached é um sistema de cache distribuído de alto desempenho na memória RAM. É ideal para armazenar pares simples de "chave-valor" e sessões. Diferente do APCu, o Memcached opera como um servidor separado e pode ser compartilhado entre vários servidores web.
Instalação da extensão: pecl install memcached
Exemplo de conexão e uso:
<?php$memcached = new Memcached();$memcached->addServer('localhost', 11211);
// Define com TTL (time to live) de 600 segundos$memcached->set('user_123_profile', $profileData, 600);
// Obtém$profile = $memcached->get('user_123_profile');if ($memcached->getResultCode() === Memcached::RES_NOTFOUND) { // Cache miss — carrega do banco $profile = getUserProfileFromDB(123); $memcached->set('user_123_profile', $profile, 600);}
// Cache de sessões (configuração no php.ini)// session.save_handler = memcached// session.save_path = "localhost:11211"?>Quando usar Memcached:
- Cache de resultados de consultas SQL (listas de produtos, categorias)
- Armazenamento de sessões de usuários em ambiente distribuído
- Cache de blocos HTML (por exemplo, menu ou rodapé)
Limitações: sem estruturas de dados integradas (apenas strings), tamanho máximo de valor de 1 MB (pode ser aumentado), sem persistência — o cache é limpo ao reiniciar o servidor.
3. Redis — cache avançado com estruturas de dados
Redis não é apenas um cache, mas um armazenamento completo de dados em memória com suporte a tipos complexos: listas, conjuntos, hashes, conjuntos ordenados. Ele suporta persistência (salvamento em disco),