Consultar a base de dados para coletar as mesmas informações sempre que um visitante acessa, prejudica muito a performance. Dependendo da quantidade de usuários simultâneos, a sua aplicação pode ficar indisponível (normalmente devido as requisições a base de dados).
Uma estratégia para turbinar sua aplicação e garantir a alta disponibilidade com ganho de performance é criar cache das informações que são regularmente consultadas. Para isto vamos utilizar o memcached, um software projetado para utilizar a memória RAM como cache.
O memcached foi desenvolvido por Brad Fitzpatrick em 2003 para atender a alta demanda de acessos do site Livejournal, mas o Facebook, que tirou o maior proveito da tecnologia, em 2005, implantou o memcached em sua infra estrutura, que colaborou para a grande escalabilidade. Hoje o Facebook possui estimadamente mais de 800 servidores e 28TB de memória sendo utilizados como cache.
Memcached vs. Memcache
Normalmente gera uma grande confusão… É memcached ou memcache?
Memcache é o módulo que fornece a relação processual e orientada a objeto para o memcached, cache daemon altamente eficaz, que foi especialmente projetado para reduzir a carga de banco de dados em aplicações dinâmicas.
Memcached é o software de alta performance. Memória distribuída baseado em sistema de cache de objeto, de natureza genérica, mas destinado a ser utilizado para acelerar aplicações dinâmicas, aliviando a carga do banco de dados.
Neste artigo vamos abordar a instalação e a utilização do mamcached na prática. Para isso utilizamos a arquitetura LAMP – porém o memcached pode ser utilizado em diversas outras linguagens e sistemas operacionais.
Só para deixar claro, todos os procedimentos foram realizados com a distribuição Linux Debian 6.0 ( Squeeze ).
Antes de começar, é uma boa ideia atualizar o apt-get e garantir que todos os pacotes da distribuição estejam atualizados:
sudo apt-get update
Se você ainda não tiver o PHP e MySQL instalado execute:
sudo apt-get install mysql-server mysql-cliente php5 php5-mysql
Instalando o Memcached
Extensão do PHP Memcache:
sudo apt-get install php5-memcache
Agora, instale o memcached via apt-get:
sudo apt-get install memcached
A próxima etapa é instalar o PEAR ( PHP Extension and Aplication Repository ), um repositório com diversos componentes para o PHP.
sudo apt-get install php-pear
Instale o Build Essential, caso ainda não tenha instalado na sua distribuição.
sudo apt-get install build-essential
Finalmente iremos utilizar o PECL (PHP Extension Community Library) para instalar o memcache.
sudo pecl install memcache
Depois de concluída a instalação do memcache com o PECL, crie o arquivo memcache.ini dentro do diretório onde ficam os arquivos de configuração dos módulos do PHP:
echo "extension = memcache.so" | sudo tee /etc/php5/conf.d/memcache.ini
Pronto, agora você está pronto para começar a utilizar o memcache.
Verifique se ele foi instalado corretamente procurando-o:
ps aux | grep memcache
Você pode ver as estatísticas do memcache com o seguite comando:
echo "stats settings" | nc localhost 11211
Memcached na Prática
O nosso objetivo é recuperar as informações sem precisar consultar a base de dados. Somente se as informações não estiverem cacheadas iremos consultar a base de dados e após armazenar as informações em cache para as futuras consultas.
Conectando com Memcached
// Constantes necessárias para conexão
define('MEMCACHED_HOST', '127.0.0.1');
define('MEMCACHED_PORT', '11211');
// Objeto / Conexão
$memcache = new Memcache;
$cacheAvailable = $memcache->connect(MEMCACHED_HOST, MEMCACHED_PORT);
Armazenando as informações
// Validamos o conteúdo das variáveis
// Escapamos o conteúdo das variáveis com mysql_real_escape_string()
// Escrevemos as informações na base de dados:
$sql = "INSERT INTO products (id, name, description, price) VALUES ($id, '$name', '$description', $price)";
$query = mysql_query($sql, $db);
if ( $query === true )
{
// Para identificar o produto, precisaremos criar uma chave única para o array associativo
// Utilizaremos a palavra 'product' mais o id do produto (ex. "product_12")
$key = 'product_' . $id;
$product = array('id' => $id, 'name' => $name, 'description' => $description, 'price' => $price);
// Para realizar o amazenamento em cache, invocaremos o método "set" do objeto $memcache.
$memcache->set($key, $product);
}
Recuperando as informações
// Inicializamos a variável $product
$product = null;
// Inicializamos a variável $key
$key = null;
// Verificamos se o servidor de cache está disponível checando se a variável $cacheAvailable foi inicializada
if ( $cacheAvailable )
{
// Construimos a chave do array associativo para obter as informações do produto
$key = 'product_' . $id;
}
// Checamos se não existe o cache referente ao produto
// Se não existir as informações em cache, iremos consultar a base de dados
if ( !( $product = $memcache->get($key) ) )
{
// Buscamos as informações do produto na base de dados
$sql = "SELECT id, name, description, price FROM products WHERE id = " . $id;
$queryResource = mysql_query($sql, $db);
$product = mysql_fetch_assoc($queryResource);
/**
Aqui você deve incluir a rotina para armazenamento das informações obtidas do MySQL, na próxima consulta as informações estarão em cache e não precisará consultar a base de dados novamente.
**/
}
Para conhecer todos os métodos disponíveis da classe memcache, acesse : http://www.php.net/manual/en/class.memcache.php
Conclusão
Acelerar a recuperação das informações é o fator essencial para obeter a alta performanc. Com o memcached podemos estruturar excelentes arquiteturas de cache em memória RAM utilizando um ou muitos servidores. Ao utilizar o memcache não espere substituir ou armazenar todas as informações na memória, opte sempre por armazenar as informações que são mais relevantes e que produzam realmente o ganho na performance da aplicação.



