1. Criando arquivos de cache usando o buffer de saída

O principal por trás do buffer de saída é que você gera uma página normalmente usando PHP, mas a saída é armazenada na memória em vez de ser enviada diretamente para o navegador. Isto dá uma chance para programadores preguiçosos para enviar alguns novos cabeçalho comandos, mas também torna possível para nós para escrever a saída para um arquivo.

A lógica por trás do script a seguir, que você pode simplesmente incluir no topo de uma página, é a seguinte:

  1. Se uma versão em cache da página existe E não é muito velho, em seguida, exibir esse arquivo e sair: cache_display () ;
  2. ELSE, escreva a saída para um arquivo e exiba-o no navegador : cache_page () .
<?PHP
 // Adapted for The Art of Web: www.the-art-of-web.com
 // Based on PHP code by Dennis Pallett: www.phpit.net
 // Please acknowledge use of this code by including this header.

// location and prefix for cache files
 define('CACHE_PATH', "/tmp/cache_");

// how long to keep the cache files (hours)
 define('CACHE_TIME', 12);

// return location and name for cache file
 function cache_file()
 {
 return CACHE_PATH . md5($_SERVER['REQUEST_URI']);
 }

// display cached file if present and not expired
 function cache_display()
 {
 $file = cache_file();

// check that cache file exists and is not too old
 if(!file_exists($file)) return;
 if(filemtime($file) < time() - CACHE_TIME * 3600) return;

// if so, display cache file and stop processing
 readfile($file);
 exit;
 }

// write to cache file
 function cache_page($content)
 {
 if(false !== ($f = @fopen(cache_file(), 'w'))) {
 fwrite($f, $content);
 fclose($f);
 }
 return $content;
 }

// execution stops here if valid cache file found
 cache_display();

// enable output buffering and create cache file
 ob_start('cache_page');
?>

Nota: salve este script como buffer.php e inclua-o no topo de seus arquivos HTML / PHP.

Este script assume a existência de um diretório / tmp / que pode ser gravado pelo servidor web. Se este não for o caso, ou se você quiser armazenar arquivos de cache em um local diferente, você precisará criar um diretório que possa ser gravado pelo servidor web ( chgrp para o servidor web server e chmod 775 ) e alterar a constante CACHE_PATH de acordo.

Ele também pressupõe que $ _SERVER ['REQUEST_URI'] está definido, o que nem sempre é o caso no Windows XP ou no Microsoft IIS. Veja os comentários dos usuários com a documentação do PHP sobre Variáveis ​​Predefinidas para um work-around.

2. Como utilizo este script?

Você precisa incluir este script antes de exibir qualquer conteúdo para a página. O código HTML e PHP subseqüente só será acessado conforme necessário para atualizar o arquivo de cache (uma vez para começar com e, em seguida, cada CACHE_TIME horas).

Algumas coisas que você pode querer considerar se você usar isso em um site ao vivo:

  • Certifique-se de excluir seções do site que precisam ser dinâmicas, fóruns, por exemplo; e
  • Certifique-se de que qualquer sistema de gerenciamento de conteúdo que você usa que atualiza o conteúdo do site também sabe para excluir os arquivos de cache relevantes, caso contrário, você estará esperando horas para ver a atualização do site.

Outros, então, que é realmente trivial. A vantagem de usar / tmp / como o diretório de destino é que serviços como o tmpreaper podem limpar automaticamente qualquer lixo deixado para trás quando a estrutura do site mudar ou as páginas forem removidas.

Caso contrário, para remover um arquivo de cache usando PHP você precisará da seguinte função:

<?PHP
  function cache_remove($path)
  {
    $file = CACHE_PATH . md5($path);
    if(file_exists($file)) unlink($file) or die("Could not remove file: $file!");
  }
?>

Onde $ path é o REQUEST_URI da página a ser ‘un-cached’ e CACHE_PATH é como definido anteriormente .

3. Vantagens do buffer de saída em relação a outros métodos

A beleza desta solução é que é completamente independente do método que você usa para gerar conteúdo. Se as páginas são codificadas manualmente, geradas por um CMS ou extraídas de uma fonte externa não faz diferença. Mesmo o esquema de endereçamento é irrelevante. Outro benefício é que os arquivos de cache podem ser removidos sempre que você quiser sem afetar o site. Finalmente, todo o script pesa apenas 20 linhas de código!

Compare isso com outros métodos em que você tem um CMS horrivelmente complicado gerando arquivos PHP que são analisados ​​e servidos no navegador. Se esta é a única maneira de gerar novos conteúdos ou editar conteúdo existente, torna-se difícil fazer algumas alterações simples.

Uma abordagem alternativa é a “aranha” de um site dinâmico, um com o mecanismo de busca amigável URL’s , para criar uma versão estática que pode ser servido a partir do mesmo ou outro servidor. Mais uma vez, como um webmaster você está um passo removido quando se trata de atualizar o conteúdo.

Antes que qualquer um salta dentro com seu sistema favorito do caching, eu sou certo que é muito bom mas há muitos deles – todos com vantagens diferentes, mas nada este simples.

4. Fechar a Cache

Após uma consulta da McClain (ver Comentários abaixo), também podemos mostrar como armazenar o conteúdo em cache em um formato compactado. Isso significa que compactamos o conteúdo conforme ele é gravado no diretório de cache, e descompactá-lo para exibição.

Muitos servidores e navegadores agora suportam a entrega de todo o conteúdo em HTML / texto em formato gzip, mas não é disso que estamos falando aqui. Neste caso, os dados seriam armazenados compactados, mas entregues como HTML / texto normal. A entrega de conteúdo compactado requer um trabalho adicional.

As mudanças foram destacadas:

<?PHP
  // Adapted for The Art of Web: www.the-art-of-web.com
  // Based on PHP code by Dennis Pallett: www.phpit.net
  // Please acknowledge use of this code by including this header.

  // location and prefix for cache files
  define('CACHE_PATH', "/tmp/cache_");

  // how long to keep the cache files (hours)
  define('CACHE_TIME', 12);

  // return location and name for cache file
  function cache_file()
  {
    return CACHE_PATH . md5($_SERVER['REQUEST_URI']);
  }

  // display cached file if present and not expired
  function cache_display()
  {
    $file = cache_file();

    // check that cache file exists and is not too old
    if(!file_exists($file)) return;
    if(filemtime($file) < time() - CACHE_TIME * 3600) return;

    // if so, display cache file and stop processing
    echo gzuncompress(file_get_contents($file));
    exit;
  }

  // write to cache file
  function cache_page($content)
  {
    if(false !== ($f = @fopen(cache_file(), 'w'))) {
      fwrite($f, gzcompress($content));	
      fclose($f);
    }
    return $content;
  }

  // execution stops here if valid cache file found
  cache_display();

  // enable output buffering and create cache file
  ob_start('cache_page');
?>

Isso reduzirá significativamente o tamanho do diretório de cache, mas também adicionará alguma carga ao servidor para compactar e descompactar o conteúdo.

Novamente , isso não é o mesmo que a compressão gzip, que inclui alguns dados de cabeçalho.

Em http://www.the-art-of-web.com/php/buffer/cachephp

Advertisements