Usando APC (Alternative PHP Cache)

Posted on setembro 15, 2011. Filed under: PHP, Tuning | Tags:, , , |

APC, sigla de Alternative PHP Cache, é um cache de opcode que pode aumentar significativamente o desempenho da sua aplicação. Além de fazer o cache de variáveis/objetos, assim como o memcached, ele tem a função de fazer cache do próprio código compilado do php. De qual forma ? Para entender, é importante alguns conceitos básicos. Como todos sabemos, PHP é uma linguagem interpretada (Diferente de Java, C, etc.). Quando realizado uma requisição para uma página php, o engine do php lê o código fonte php, compila em um bytecode, chamado opcode, e finalmente o executa. Toda requisição passa por esse processo. O que o APC faz nesse processo ? Ele faz o cache do bytecode compilado (opcode) e o reutiliza nas requisições subsequêntes. Isto reduz o tempo de processamento no servidor. Em sites de alto tráfego, o desempenho pode melhorar significativamente.

O APC é distribuído através de um módulo PECL e pode ser facilmente instalado e habilitado em distribuições como Ubuntu através do comando abaixo:

$ sudo apt-get install php-apc

O comando acima irá instalar o módulo e reiniciar o apache automaticamente. Para checar se o APC foi instalado com sucesso e esta habilitado, crie um php com o comando phpinfo(); e verifique à presença da sessão apc conforme imagem abaixo:

phpinfo-apc

Junto com o pacote de instalação do APC é distribuído um script, apc.php, usado para administração do cache. Através dessa interface é possível visualizar à utilização do cache, como as variáveis e scripts contidos nele, entre outras coisas. Você precisa copiar o script apc.php para dentro do DocumentRoot do seu webserver. No Ubuntu pode ser feito da seguinte maneira:

$ cp /usr/share/doc/php-apc/apc.php.gz /var/www
$ cd /var/www
$ gunzip apc.php.gz

Edite o arquivo apc.php e especifique uma senha de sua preferência na linha 42 (no meu caso):

...
defaults('ADMIN_USERNAME','apc');                       // Admin Username
defaults('ADMIN_PASSWORD','password');          // Admin Password - CHANGE THIS TO ENABLE!!!

Acessando a interface administrativa do cache:

http://localhost/apc.php

Através da interface administrativa é possível visualizar informações relativas às páginas e variáveis em cache. É possível também limpar o cache do servidor (opcode) como também limpar o cache do usuário (referente à variáveis e objetos que o programador colocou no cache). Para limpar o cache é necessário logar como administrador através do link no canto superior direito. Para logar, utilize o usuário e senha setados no arquivo apc.php. É interessante navegar pelas opções para entender as informações ali contidas. Segue a tela administrativa:

Aconselho a limpar o cache de opcode, através do botão “Clear opcode Cache”, periodicamente. Essa opção esta disponível somente quando logado.

Exemplos de Utilização do cache

Assim como o memcached, podemos utilizar o apc para cache de dados na aplicação. Segue abaixo exemplo:

<?php

// verifica se os dados do usuário estão no cache
if ($usuarios = apc_fetch('usuarios')) {
        echo "Dados no Cache: ";
} else {
        // adiciona dados do usuário no cache
        $usuarios = array(
                array('id' => 1, 'nome' => 'Manuel', 'email' => 'manuel@xxxxyy.com.br', 'telefone' => '011-1111-1111'),
                array('id' => 2, 'nome' => 'Pereira', 'email' => 'pereira@xxxxyy.com.br', 'telefone' => '011-2222-2222'),
        );
        apc_add('usuarios', $usuarios);
}

echo "<pre>";
var_dump($usuarios);
echo "</pre>";

Ao acessar o script pela primeira vez, os dados são registrados no cache. Os acessos subsequentes obterão os dados do cache. Segue resultado:

Inserindo objetos no cache

Podemos também inserir objetos tranquilamente em nosso cache. As funções do apc já fazem a serialização do objeto antes de inserí-lo no cache e vice-versa na hora de obter o objeto do cache:

<?php

// classe para armazenar dados do usuario
class usuario {
        private $id;
        private $nome;
        private $email;
        private $telefone;

        public function setId($id) {
                $this->id = $id;
        }
        public function getId() {
                return $this->id;
        }

        public function setNome($nome) {
                $this->nome = $nome;
        }
        public function getNome() {
                return $this->nome;
        }

        public function setEmail($email) {
                $this->email = $email;
        }
        public function getEmail() {
                return $this->email;
        }

        public function setTelefone($telefone) {
                $this->telefone = $telefone;
        }
        public function getTelefone() {
                return $this->telefone;
        }
}

// verifica se objeto consta no cache
if ($usuario = apc_fetch('usuario')) {
        echo "Dados no Cache: ";
} else {
        // criar cache para objeto usuario
        $usuario = new Usuario();
        $usuario->setId(1);
        $usuario->setNome('Manuel');
        $usuario->setEmail('manuel@xxxxx.com.br');
        $usuario->setTelefone('11-1111-1111');

        apc_add('usuario', $usuario);
}

echo "<pre>";
echo $usuario->getId() . PHP_EOL;
echo $usuario->getNome() . PHP_EOL;
echo $usuario->getEmail() . PHP_EOL;
echo $usuario->getTelefone() . PHP_EOL;
echo "</pre>";

Resultado:

Mais algumas Dicas

Para limpar uma variável/objeto do cache:

apc_delete('usuarios');
apc_delete('usuario');

Limpando todos dados do Cache:

// limpando o cache de opcode
apc_clear_cache();

// limpando o cache do usuário
apc_clear_cache('user');

Armazenando variáveis no cache:

apc_store('usuario', $usuario);

A diferença entre apc_add e apc_store é que o apc_store sobrescreve o valor no cache caso o identificador já exista. O apc_add não sobrescreve dados já existentes no cache com o mesmo identificador.

Procurei demonstrar aqui uma introdução à utilização de cache no php com APC. Segue abaixo alguns links para se aprofundar mais:

http://www.php.net/apc
http://pecl.php.net/support.php
http://devzone.zend.com/article/12618

Ler Post Completo | Make a Comment ( 3 so far )

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

%d blogueiros gostam disto: