Usando PEAR para armazenar programas PHP em buffer
O buffer é um tema importante no mundo PHP, pois as páginas dinâmicas geradas pelo PHP precisam ser recalculadas toda vez que o usuário as solicita, independentemente de o resultado da solicitação ser o mesmo. Ao mesmo tempo, o PHP compila o script todas as vezes. Essa sobrecarga certamente seria insuportável para um site com alto tráfego. Felizmente, os resultados da Web podem ser armazenados em cache sem a necessidade de reexecutar e compilar o script. Produtos comerciais como ZendCache ou o Alternate PHP Cache de código aberto fornecem uma maneira de compilar scripts PHP em código de bytes e armazená-los em cache.
O pacote de buffer do PEAR fornece uma estrutura para buffer de conteúdo dinâmico, consultas de banco de dados e chamadas de função PHP.
Assim como Perl possui CPAN e TeX possui CTAN, o PHP também possui sua própria biblioteca central de recursos para armazenar classes, bibliotecas e módulos. Esta biblioteca é chamada PEAR (Repositório de extensões e complementos PHP).
Este artigo pressupõe que você instalou o ambiente PEAR. Caso contrário, você pode baixá-lo do site PHP. O pacote de buffer do PEAR contém uma classe de buffer geral e diversas subclasses especializadas. As classes de buffer usam classes de contêiner para armazenar e gerenciar dados em buffer.
A seguir estão os contêineres atualmente contidos no buffer PEAR e seus respectivos parâmetros:
arquivo — O contêiner de arquivo armazena dados em buffer no sistema de arquivos e é o contêiner mais rápido.
cache_dir — Este é o diretório onde o contêiner armazena os arquivos.
filename_prefix — O prefixo dos arquivos armazenados em cache, por exemplo: "cache_".
shm — O contêiner shm coloca dados em buffer na memória compartilhada. Os benchmarks mostram que, com a implementação atual, esse contêiner é mais lento que o contêiner de arquivo.
shm_key — A chave usada pela memória compartilhada.
shm_perm — Permissão para usar segmentos de dados de memória compartilhada.
shm_size — tamanho da memória compartilhada alocada.
sem_key — O valor chave do semáforo.
sem_perm — Permissões para o semáforo.
db — camada de abstração de banco de dados do PEAR.
dsn — O DSN da conexão com o banco de dados. Você pode consultar a documentação do banco de dados do PEAR.
cache_table — O nome da tabela.
phplib — O contêiner phplib usa uma camada de abstração de banco de dados para armazenar buffers.
classe_db
arquivo_bd
caminho_bd
arquivo_local
caminho_local
ext/dbx - extensão da camada de abstração do banco de dados do PHP Se você deseja armazenar buffers no banco de dados, você pode usar este contêiner.
módulo
hospedar
banco de dados
nome de usuário
senha
tabela_cache
persistente
A melhoria de desempenho obtida usando o PEAR Cache depende do contêiner de buffer escolhido. Por exemplo, não faz sentido armazenar os resultados do banco de dados novamente no cache do banco de dados.
O módulo de buffer de função do PEAR Cache pode armazenar em buffer os resultados de qualquer função ou método, seja uma função interna do PHP ou uma função definida pelo usuário. Ele usa um contêiner de arquivo por padrão e coloca os dados armazenados em buffer em um diretório chamado function_cache.
O construtor da classe Cache_Function pode ter três parâmetros opcionais:
$container: o nome do contêiner de buffer.
$container_options: Parâmetros de array do contêiner de buffer.
$expires: O tempo (em segundos) que o objeto buffer expira.
Quando uma chamada de função normal usa o método call() da classe Cache_Function, o buffer pode ser acionado. Chamar call() é fácil, um argumento é o nome da função, depois os argumentos da função, o segundo argumento é a primeira das funções a serem chamadas e assim por diante, vejamos um exemplo:
Exemplo 1 Chamando funções e métodos de buffer
//Chama o buffer de função do PEAR Cache.
require_once 'Cache/Função.php';
// Defina algumas classes e funções.
classe foo {
barra de funções($teste) {
echo "foo::bar($teste)
";
}
}
barra de classe {
função foobar($objeto) {
echo '$'.$objeto.'->foobar('.$objeto.')
';
}
}
$barra = nova barra;
função fobar() {
echo 'foobar()';
}
//Obtém o objeto Cache_Function
$cache = new Cache_Function();
// Armazena em buffer a função estática bar() da classe foo (foo::bar()).
$cache->call('foo::bar', 'teste');
// $bar->foobar()
$cache->call('bar->foobar', 'bar');
$cache->call('foobar');
?>
Abaixo usamos Cache_Output para armazenar em buffer a saída:
Exemplo 2 Buffer de saída do script
//Carrega o buffer de saída do PEAR Cache
require_once 'Cache/Saída.php';
$cache = new Cache_Output('arquivo', array('cache_dir' => '.') );
// Calculamos a marca da página a ser armazenada em buffer, assumimos que o buffer da página depende de
// URL, variáveis HTTP GET e POST e cookies.
$cache_id = $cache->generateID(
array('url' => $REQUEST_URI, '
postar' => $HTTP_POST_VARS, 'cookies' => $HTTP_COOKIE_VARS) );
//Buffer de consulta
if ($content = $cache->start($cache_id)) {
//buffer atingido
eco $conteúdo;
morrer();
}
//buffer perdido
// -- Insira conteúdo aqui para gerar código --
// Armazena a página no buffer
echo $cache->end();
?>
Usando a classe Cache_Output, é fácil converter um aplicativo de site dinâmico baseado em banco de dados em um aplicativo estático, melhorando muito o desempenho do site. Cada vez mais sites estão utilizando GZIP para compactar conteúdo HTML, o que reduz o consumo de largura de banda do servidor e também pode beneficiar muito os usuários que utilizam Modem para acessar a Internet.
Cache_OutputCompression estende a funcionalidade da classe Cache_Output. Ele armazena em buffer o conteúdo HTML compactado GZIP, economizando assim o tempo de compactação da CPU.