Usando Memcached para Cache de Dados PHP no ServBay
O ServBay é um ambiente local de desenvolvimento web robusto, que vem pré-instalado com o pacote de software Memcached (servidor Memcached) de alto desempenho e a extensão correspondente para PHP. Isso facilita para os desenvolvedores implementarem cache eficiente de dados em aplicações PHP, aumentando significativamente o desempenho das aplicações.
Este artigo detalha como verificar e utilizar o Memcached e sua respectiva extensão PHP no ServBay.
Introdução ao Memcached
Memcached é um sistema distribuído de cache de objetos em memória de alto desempenho. Ele armazena temporariamente dados (como resultados de consultas ao banco de dados, respostas de APIs, fragmentos de páginas etc.) diretamente na memória, diminuindo o número de acessos ao armazenamento de dados de back-end (por exemplo, banco de dados), acelerando assim a resposta e a vazão de aplicações web dinâmicas.
Principais Características
- Alto desempenho: Os dados são armazenados em memória, proporcionando leitura e escrita extremamente rápidas.
- Distribuído: Permite criar um pool de cache distribuído entre vários servidores, facilitando a escalabilidade.
- Simplicidade: Protocolo simples, ampla variedade de bibliotecas clientes e fácil integração.
- Reduz a carga do banco de dados: Diminui efetivamente a pressão de consultas no banco de dados, especialmente em cenários de alta concorrência.
Diferenças entre as extensões PHP memcache
e memcached
No PHP, existem duas extensões populares para conectar-se ao servidor Memcached: memcache
e memcached
. Apesar dos nomes semelhantes, tratam-se de extensões diferentes, com APIs e funções distintas:
Extensão
memcache
:- Uma das primeiras extensões PHP para Memcached.
- Fornece uma API procedural (
memcache_connect()
,memcache_set()
, etc.). - Funcionalidade básica e não suporta todos os recursos avançados, como hash consistente (embora alguns clientes implementem isso).
Extensão
memcached
:- Extensão PHP mais recente (baseada na biblioteca libmemcached).
- Disponibiliza uma API orientada a objetos (classe
Memcached
). - Suporta recursos avançados como hash consistente, protocolo binário, autenticação SASL, opções de serialização flexíveis e outros.
- Geralmente, recomenda-se utilizar a extensão
memcached
por oferecer mais recursos e manutenção ativa.
O ServBay oferece por padrão — e recomenda o uso — da extensão PHP memcached
, mais completa e poderosa.
Pacote Memcached e Extensão PHP no ServBay
O ServBay integra não só o servidor Memcached como um pacote gerenciável, mas também pré-instala e habilita por padrão a extensão PHP memcached
para todas as versões de PHP integradas.
Isso significa que, na maioria dos casos, assim que você instala o ServBay, tanto o servidor Memcached quanto a extensão PHP já estarão prontos para uso, sem necessidade de recompilar ou configurar nada adicional no PHP.
Como verificar o status do pacote Memcached:
Você pode localizar o pacote Memcached
na interface principal do ServBay ou na área de gerenciamento de pacotes, e confirmar que o status está como "em execução". Se não estiver rodando, tente iniciar o serviço.
Como verificar se a extensão PHP memcached
está carregada:
A maneira mais fácil de confirmar se a extensão foi carregada para sua versão específica do PHP é usando a função phpinfo()
:
Na raiz do seu site ServBay (por padrão,
/Applications/ServBay/www
), crie um novo arquivo PHP, por exemplo,info.php
.Insira o seguinte conteúdo:
php<?php phpinfo(); ?>
1
2
3Acesse este arquivo pelo site local configurado no ServBay (exemplo: se o seu domínio for
servbay.demo
, acessehttp://servbay.demo/info.php
).Na página exibida de
phpinfo
, procure por "memcached". Se aparecer uma seção chamada "memcached" listando informações de configuração e a versão, a extensão está carregada e pronta para uso.
Utilizando Memcached em Código PHP
Após confirmar que o servidor Memcached está rodando e que a extensão PHP memcached
está ativa, você já pode utilizar a classe Memcached
no seu código PHP para conectar ao servidor e executar operações de cache.
Por padrão, o servidor Memcached opera em localhost
e na porta padrão 11211
.
Exemplo de Código
Abaixo segue um exemplo simples de código PHP mostrando como conectar ao servidor Memcached local e realizar operações de set/get de dados usando a classe Memcached
:
Salve o código a seguir como um arquivo PHP no diretório do seu site ServBay (por exemplo, /Applications/ServBay/www/memcached_test.php
):
<?php
// Informações do servidor Memcached
$memcached_host = 'localhost';
$memcached_port = 11211;
// Cria uma instância do cliente Memcached
$memcached = new Memcached();
// Adiciona o servidor Memcached ao pool de conexões do cliente
// O método addServer() retorna um valor booleano indicando sucesso ao adicionar à lista, mas não garante conexão imediata
if (!$memcached->addServer($memcached_host, $memcached_port)) {
// Atenção: falha no addServer geralmente está relacionada à configuração, não necessariamente à conexão ao servidor
die("Não foi possível adicionar o servidor Memcached à lista de conexões do cliente. Verifique o host e a porta configurados.");
}
// Teste de conexão tentando recuperar uma chave inexistente (opcional, porém recomendado)
// get() retorna false ou array vazio se a chave não existir ou se houver problemas de conexão
// Memcached::getResultCode() pode trazer um código de status mais detalhado
$test_key = 'servbay_memcached_connection_test';
$memcached->get($test_key); // Tenta buscar uma chave que não existe
$result_code = $memcached->getResultCode();
if ($result_code !== Memcached::RES_NOTFOUND && $result_code !== Memcached::RES_SUCCESS) {
// Se não for RES_NOTFOUND nem RES_SUCCESS, pode indicar um problema de conexão
// Atenção: RES_SUCCESS pode aparecer ao buscar um valor vazio
// Uma verificação mais rigorosa pode demandar mais lógica ou depender do comportamento específico do cliente
// Para desenvolvimento local, geralmente considerar addServer bem-sucedido e ausência de erros nas operações como conexão OK
echo "Atenção: pode haver um problema ao conectar ao servidor Memcached. Result Code: " . $result_code . "<br>";
// Em ambientes reais, o tratamento de erros pode precisar ser mais detalhado
} else {
echo "Conexão bem-sucedida com o servidor Memcached ({$memcached_host}:{$memcached_port}).<br>";
}
// --- Exemplos de operações de cache ---
// Dados a serem armazenados em cache
$key = 'user_profile_1234';
$data = [
'id' => 1234,
'username' => 'servbay-demo',
'email' => '[email protected]',
'status' => 'active'
];
$expiration = 3600; // Tempo de expiração do cache, em segundos (aqui, 1 hora)
// Armazenando dados no cache
// O método set() retorna um booleano indicando se a operação foi bem-sucedida
if ($memcached->set($key, $data, $expiration)) {
echo "Dados armazenados com sucesso no Memcached, chave '{$key}', expiração em {$expiration} segundos.<br>";
} else {
echo "Falha ao armazenar dados no cache!<br>";
// Use $memcached->getResultCode() para diagnosticar falhas
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Tentando recuperar dados do cache
echo "Tentando recuperar dados do cache...<br>";
$cachedData = $memcached->get($key);
if ($cachedData !== false) { // Memcached::get() retorna false se não houver cache ou falha na busca
echo "Dados recuperados do cache com sucesso:<br>";
echo "<pre>";
print_r($cachedData);
echo "</pre>";
} else {
echo "Cache não encontrado ou falha na busca para a chave '{$key}'.<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Demonstração de comportamento após expiração do cache (assumindo passagem do tempo)
// Geralmente, na aplicação, verifique se $cachedData é false; se sim, recarregue do banco de dados ou fonte original e regrave no cache.
// Exemplo: Remover dados do cache
/*
echo "Tentando remover dados do cache...<br>";
if ($memcached->delete($key)) {
echo "Dados removidos do cache com sucesso, chave '{$key}'.<br>";
} else {
echo "Falha ao remover dados do cache!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Testar novamente a busca após remoção
echo "Tentando buscar novamente os dados removidos...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "Dados ainda presentes (remoção falhou):<br>";
print_r($cachedDataAfterDelete);
} else {
echo "Dados não encontrados no cache (como esperado).<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
// Exemplo: Limpar todo o cache (use com cuidado!)
/*
echo "Tentando limpar todo o cache...<br>";
if ($memcached->flush()) {
echo "Todos os dados do cache foram limpos.<br>";
} else {
echo "Falha ao limpar o cache!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Acesse o arquivo memcached_test.php
pelo endereço local configurado no ServBay para visualizar mensagens de conexão, resultado de armazenamento e recuperação dos dados em cache.
Observações
- Certifique-se de que o pacote Memcached no ServBay está em execução.
- O Memcached, por padrão, escuta em
127.0.0.1
(oulocalhost
) na porta11211
. Geralmente, não é necessário alterar isso. - Se houver falha na conexão via PHP, verifique se o pacote Memcached está rodando e se não há firewall bloqueando conexões locais.
- O método
addServer
da classeMemcached
apenas adiciona o servidor ao pool para conexão futura — não estabelece conexão persistente ou verifica a disponibilidade imediatamente. O teste real de conexão ocorre ao chamar métodos comoget
,set
, etc. Observe o retorno destas funções ou utilizegetResultCode()
para checar sucesso ou falha.
Conclusão
O ServBay oferece aos desenvolvedores um método extremamente prático para utilizar o Memcached. Com o servidor Memcached integrado e a extensão PHP memcached
pré-instalada e ativada por padrão, não há necessidade de instalações ou configurações complexas. Assim, você pode rapidamente aproveitar o poder do Memcached no seu ambiente de desenvolvimento local, garantindo performance otimizada em suas aplicações PHP.