Usando APC (Alternative PHP Cache)
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:

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






[...] desse processo podemos utilizar um cache de opcode, da forma como vimos no post anterior sobre o APC. Mas como funciona exatamente um cache de opcode ? Quando uma nova requisição é realizada, antes [...]
PHP – Opções de cache de opcode « Pasqua Tecnologia
setembro 28, 2011
estou com um problema: Quando uso require ou include da erro.
sabe me dizer pq?
fabiano
janeiro 26, 2012
Em qual local do script esta usando require/include ? Pode postar o erro aqui ?
pasquati
janeiro 26, 2012