Usando memcached no PHP

Posted on agosto 22, 2011. Filed under: PHP, Tuning |

Memcached utilizando junto com php, permite você aumentar a perfomance de sua aplicação fazendo cache de dados na memória. Usar o memcached para carregar dados, ao invés de carregar de um banco de dados ou do sistema de arquivos, pode ter um grande impacto na perfomance de sua aplicação php.

A regra básica de utilização de cache é simples: Conforme o client (usuário) acessa seu site onde os dados são provenientes de um banco de dados ou qualquer outra fonte de informações, inicialmente esses dados são gravados em um cache, no nosso caso usando o memcached. Nas próximas requisições, ao invés de buscar as informações no banco de dados novamente, iremos primeiro checá-las se existem no cache e caso existindo, são retornadas do cache e não do banco de dados. Em um outro momento, caso essas informações sofrerem atualizações na sua fonte de dados (database, etc..), iremos destruir o cache no memcached e reiniciar o ciclo novamente. Normalmente utilizamos um id único para identificar uma porção de dados gravados ou lidos em um cache.

Somente por curiosidade, o Zend Framework disponibiliza um módulo de Cache que pode ser utilizado juntamente com o memcached. Iremos abordar esse módulo em um post futuro.

Instalando e habilitando memcached no PHP

$ sudo apt-get install memcached
$ sudo apt-get install php5-memcached

O php também disponibiliza a bilioteca memchache, através do pacote php5-memcache, porém aconselho utilizar a biblioteca mancached como citado acima pois é mais atual e implementa o protocolo do memcache de forma mais eficiente.

Verificando se o serviço do memcached esta no ar:

$ ps ax | grep memcached

Reiniciando Apache:

$ sudo service apache2 restart

Exemplos

Segue abaixo um exemplo simples da utilização do memcached com PHP. Os principais pontos aqui são os métodos get, que otem dados do cache usando uma chave para identificação e o método set, utilizado para inserir dados no cache, também utilizando uma chave para identificação.

<?php
// conectando no memcached
$m = new Memcached();
$m->addServer('localhost', 11211);

// checando dados no cache e carregando em $rows
if (!($rows = $m->get('lista_usuarios'))) {
    if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
        // dados não encontrados no cache. 
        // inserir no cache dados obtidos no banco
        // obter lista de usuarios do banco de dados
        // $rows = obter_lista_usuarios_db();
        $rows = array('joao', 'jose', 'maria');

        // inserindo dados
        $m->set('lista_usuarios', $rows);
    }
}

// acessando dados
var_dump($rows);

PS: No método set é possível especificar o tempo de expiração em segundos em que irá durar o cache. Caso seja omitido, é por tempo indeterminado. (nunca irá expirar).

Caso os dados do banco de dados forem modificados ou de alguma forma for determinado que o cache precisa ser atualizado existe a possibilidade de forçar a limpeza do cache através do método delete:

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

// verifica se houve modificacao na fonte de dados que esta em cache
// $dados_modificados = houve_atualizacao_dados();

$dados_modificados = true; // somente para este exemplo funcionar
if($dados_modificados) {
        $m->delete('lista_usuarios');
}

Somente lembrando que se você reiniciar o serviço do memcached, por padrão, os dados em cache serão perdidos.

Usando o memcached para armazenar dados da sessão

O memcached pode ser utilizado para outros propósitos no PHP, como por exemplo, no armazenamento de sessões. É útil no caso de estar utilizando load-balancing com o php. Ao invés de armazenar os dados de sessão em disco, todos servidores php que estão no balanceamento podem armazenar os dados de sessão em lugar centralizado, no caso, um servidor memcached. Dessa forma, caso o usuário que logou em um servidor, ao ser redirecionado para outro servidor durante o acesso no site, ele não perderá a sessão iniciada anteriormente, devido ao mecanismo de sessão estar centralizado no memcached.

Para habilitar o armazenamento da sessão no memcached, configure o php.ini dessa forma:

session.save_handler = memcached
session.save_path = "127.0.0.1:11211"

É isso ae, espero que tenham gostado. Sintam-se à vontade para postar comentários. Abraços!

Make a Comment

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

2 Respostas to “Usando memcached no PHP”

RSS Feed for Pasqua Tecnologia Comments RSS Feed

A dúvida que fica é. Você já utilizou isso em um servidor de produção real, com muitos acessos?

Bernardo, já utilizei em situações em que os dados não sofrem alterações frequentes. Por exemplo, relatórios com dados em datas retroativas. Listagens que não sofrerão mais atualizações. São pequenas ações, como a utilização do memecached, que pode ser implementado de forma simples, que faz uma boa diferança na perfomance em determinadas situações. Abs..


Where's The Comment Form?

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: