Palestra apresentada no PHP Conference 2012
Primeiramente gostaria de agradecer à organização, professores e palestrantes do evento. Houve muitas palestras interessantes, networking e troca de experiências. Achei o evento realmente enriquecedor. Não somente eu, mas meus amigos que estavam juntos tiveram a mesma opinião.
O tema da minha palestra foi Tuning Apache/MySQL/PHP para desenvolvedores. Conforme prometido no evento, pode ser baixado no link abaixo:
Tuning Apache/MySQL/PHP para desenvolvedores
Segue abaixo links para artigos que escrevi sobre o assunto:
Tuning Apache 2.x
Tuning no MySQL
PHP Profiler com xdebug e webgrind
Usando memcached no PHP
Usando APC (Alternative PHP Cache)
PHP – Opções de cache de opcode
PHP Caching com Zend_Cache
PHP e Computação em Nuvem com Zend_Cloud
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