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.