Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marcelo Bing_162098

Sistema de Armazenamento de Cache / Onde Coloca-lo ?

Recommended Posts

Achei este script de armazenamento de cache para acelerar meu Website, só que pus ele acima da tag <html> , e dei include no diretório em todas as paginas, so que até o momento ele aparenta não estar armazenando o cache nem no servidor local e nem na pasta padrão do windows.

 

o que devo fazer ? fiz algo errado ?

 

Script:

 

<?php

/**
* Sistema de cache
*
* @author Thiago Belem <contato@thiagobelem.net>
* @link http://blog.thiagobelem.net/
*/
class Cache {

       /**
        * Tempo padrão de cache
        *
        * @var string
        */
       private static $time = '5 minutes';

       /**
        * Local onde o cache será salvo
        *
        * Definido pelo construtor
        *
        * @var string
        */
       private $folder;

       /**
        * Construtor
        *
        * Inicializa a classe e permite a definição de onde os arquivos
        * serão salvos. Se o parâmetro $folder for ignorado o local dos
        * arquivos temporários do sistema operacional será usado
        *
        * @uses Cache::setFolder() Para definir o local dos arquivos de cache
        *
        * @param string $folder Local para salvar os arquivos de cache (opcional)
        *
        * @return void
        */
       public function __construct($folder = null) {
               $this->setFolder(!is_null($folder) ? $folder : sys_get_temp_dir());
       }

       /**
        * Define onde os arquivos de cache serão salvos
        *
        * Irá verificar se a pasta existe e pode ser escrita, caso contrário
        * uma mensagem de erro será exibida
        *
        * @param string $folder Local para salvar os arquivos de cache (opcional)
        *
        * @return void
        */
       protected function setFolder($folder) {
               // Se a pasta existir, for uma pasta e puder ser escrita
               if (file_exists($folder) && is_dir($folder) && is_writable($folder)) {
                       $this->folder = $folder;
               } else {
                       trigger_error('Não foi possível acessar a pasta de cache', E_USER_ERROR);
               }
       }

       /**
        * Gera o local do arquivo de cache baseado na chave passada
        *
        * @param string $key Uma chave para identificar o arquivo
        *
        * @return string Local do arquivo de cache
        */
       protected function generateFileLocation($key) {
               return $this->folder . DIRECTORY_SEPARATOR . sha1($key) . '.tmp';
       }

       /**
        * Cria um arquivo de cache
        *
        * @uses Cache::generateFileLocation() para gerar o local do arquivo de cache
        *
        * @param string $key Uma chave para identificar o arquivo
        * @param string $content Conteúdo do arquivo de cache
        *
        * @return boolean Se o arquivo foi criado
        */
       protected function createCacheFile($key, $content) {
               // Gera o nome do arquivo
               $filename = $this->generateFileLocation($key);

               // Cria o arquivo com o conteúdo
               return file_put_contents($filename, $content)
                       OR trigger_error('Não foi possível criar o arquivo de cache', E_USER_ERROR);
       }

       /**
        * Salva um valor no cache
        *
        * @uses Cache::createCacheFile() para criar o arquivo com o cache
        *
        * @param string $key Uma chave para identificar o valor cacheado
        * @param mixed $content Conteúdo/variável a ser salvo(a) no cache
        * @param string $time Quanto tempo até o cache expirar (opcional)
        *
        * @return boolean Se o cache foi salvo
        */
       public function save($key, $content, $time = null) {
               $time = strtotime(!is_null($time) ? $time : self::$time);

               $content = serialize(array(
                       'expires' => $time,
                       'content' => $content));

               return $this->createCacheFile($key, $content);
       }


       /**
        * Salva um valor do cache
        *
        * @uses Cache::generateFileLocation() para gerar o local do arquivo de cache
        *
        * @param string $key Uma chave para identificar o valor cacheado
        *
        * @return mixed Se o cache foi encontrado retorna o seu valor, caso contrário retorna NULL
        */
       public function read($key) {
               $filename = $this->generateFileLocation($key);
               if (file_exists($filename) && is_readable($filename)) {
                       $cache = unserialize(file_get_contents($filename));
                       if ($cache['expires'] > time()) {
                               return $cache['content'];
                       } else {
                               unlink($filename);
                       }
               }
               return null;
       }
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

você sabe como usar este script certo? instancia a classe, passar as referencias...??

Ele não é automático, você tem que definir o que vai ficar em cache, quando vai ficar, e quando irá expirar..

Use cache de navegador com .htaccess, é mais simples: http://www.lucaspepe...or-com-htaccess

Compartilhar este post


Link para o post
Compartilhar em outros sites

É mais simples porém não é a mesma coisa.

Pode-se usar os 2 tipos de cache em conjunto sem nenhum problema.

 

Cachear arquivos php complexos pra ficarem estáticos no server é ótimo pra desempenho em diversos casos.

 

http://elmicox.blogspot.com/2010/07/introducaozinha-sobre-cache-web-e-no.html

 

Marcelo Bing, achei esta classe que você colocou aí meio incompleta.

 

Vê se gosta dessa aqui:

 

<?php
   /*
   Criado por:     Antonio Campos
   Modificada por: Diogo Moreira
   CHANGELOG
   04-01-2008 -> Criação
   20-02-2008 -> adicionado o parametro do caminho do arquivo de cache para o construtor, para prever arquivos em niveis diferentes
              -> adicionado o tempo do cache em segundos
              -> adicionada função para limpar o buffer de saída, para não guardar lixo no arquivo de cache
   -> Segundo release!
   */
   class Cache{

   function Cache($diretorio_cache = "./cache/"){

       //Diretório onde queremos guardar os arquivos de cache
       $this->directorio_cache = $diretorio_cache; //Agora vamos começar a contruir uma string que irá conter o nome do script que vamos fazer cache

       $this->pagina = $_SERVER['SCRIPT_NAME']."?";
       //se existir uma query string vamos concatenar a mesma com o nome do arquivo

       if (isset($_SERVER['QUERY_STRING'])){

           $this->pagina=$this->pagina.$_SERVER['QUERY_STRING'];

       }

   }

   function Inicio($tpo_cache = 86400){ //172800 equivalente a 2 dias //86400 a 1 dia

       //Gerar o nome do arquivo de cache correspondente à  página que estamos

       //O MD5 é só para evitar que o nome contenha careteres inválidos por exemplo ? e & comuns nas query strings

       //coloquei a extensão html podem colocar o que quiserem

       //limpa o buffer de saída antes de começar a execução

       ob_clean();

       if(count($_POST)>0){ return false; } //pra não exibir cache em requisições post

       $this->ficheiro_cache = $this->directorio_cache . md5($this->pagina) . '.html';

       //Verificar se o ficheiro já existe na cache

       if (file_exists($this->ficheiro_cache)){

           if((time() - $tpo_cache) < filemtime($this->ficheiro_cache)){

               //se já existir e não for antigo geramos o output deste arquivo
               //ob_start("ob_gzhandler");
               readfile($this->ficheiro_cache);
               //ob_flush();

               //como já fizemos output não queremos que mais nada seja executado!

               exit();

           }
           //se o tempo não bateu, então já expirou e tenho que deletar o arquivo antigo
           unlink($this->ficheiro_cache);

       }

       //se chegar aqui é porque o arquivo não existia em cache e temos que o criar

       //esta função cria um buffer onde é colocado o outup que é igualmente enviado ao cliente

       ob_start();
       //ob_start("ob_gzhandler");

   }

   function Fim(){

       if(!$this->is_bot() && count($_POST)<1){ //só crio o arquivo se nao for um bot e nao tiver requisicao post

           // Como não exise o arquivo no cache vamos cria-lo e abrir em modo w (w de write)

           $fp = fopen($this->ficheiro_cache, 'w');

           //Escrevemos o conteudo do buffer no novo ficheiro de cache

           @fwrite($fp, ob_get_contents());

           //escreve a data e hora do cache, apenas para controle

           $hora = date('h:i:s, j-m-Y');

           @fwrite($fp, "<!-- Cache - $this->pagina - $hora -->");

           //fechamos o file pointer

           @fclose($fp);
       }

       //e fechamos tambem o buffer criado

       ob_end_flush();    
   }

function is_bot()
{ /* testa se o visitante é um bot de busca ou algo do tipo. */
   $bots = array('bot','crawler','spider','scanner','slurp','teoma','twiceler','archiver','robo');
   //takes the list above and returns (google)|(yahoo)|(msn)
   $regex = '('.implode($bots, ')|(').')';
   /*uses the generated regex above to see if those keywords are contained in the user agent variable*/     
   return eregi($regex, $_SERVER['HTTP_USER_AGENT']);
}

   function Limpar(){

       //ATENÇÃO: Este método apaga TODO o cache. Por isso, seu diretório onde ficam guardados os arquivos de
       //cache não deve conter nenhum outro tipo de dado. Esta função será aprimorada para apagar somente o
       //cache de determinada página
       //criamos um apontador para o diretorio onde esta guardado o cache

       if ($handle = $this->directorio_cache){

           //um loop que percorre todos os ficheiros

           while (false !== ($file = readdir($handle))){

           //evitar um erro!!

               if ($file != '.' and $file != '..'){

                   //somente uma informação

                   echo 'Apagado > '.$file . '<br>';

                   //apagar cada um dos arquivos

                   unlink($this->directorio_cache . '/' . $file);
               }

           }
           //fechamos o apontador

           closedir($handle);

           }
       }
   }
?>

 

Daí, nos arquivos que quiser cachear é só usar:

 

Uso antes de abrir o <html>:

 include_once "inc-cache.php";
 $cache = new Cache('./cache/');
 $cache->Inicio(864000);

 

Após fechar o html

$cache->Fim();

 

Se tiver vários tipos de página e quiser pastas de cache diferentes pra cada uma delas, sem problema, é só alterar o caminho da pasta aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parabéns pelo código, mas estou com um grande problema e agradeceria muito se alguém pudesse me ajudar.

 

O Código só está gerando o cache da Index do meu site e não tem jeito dele armazenar cache de nenhuma outra página.

 

Alguém sabe o que acontece? Estou tomando como base de estudo o código acima e me seria muito importante entender melhor como ele funciona e solucionar meu problema.



 

É mais simples porém não é a mesma coisa.
Pode-se usar os 2 tipos de cache em conjunto sem nenhum problema.

Cachear arquivos php complexos pra ficarem estáticos no server é ótimo pra desempenho em diversos casos.

http://elmicox.blogspot.com/2010/07/introducaozinha-sobre-cache-web-e-no.html

Marcelo Bing, achei esta classe que você colocou aí meio incompleta.

Vê se gosta dessa aqui:

<?php
    /*
    Criado por:     Antonio Campos
    Modificada por: Diogo Moreira
    CHANGELOG
    04-01-2008 -> Criação
    20-02-2008 -> adicionado o parametro do caminho do arquivo de cache para o construtor, para prever arquivos em niveis diferentes
               -> adicionado o tempo do cache em segundos
               -> adicionada função para limpar o buffer de saída, para não guardar lixo no arquivo de cache
    -> Segundo release!
    */
    class Cache{
    
    function Cache($diretorio_cache = "./cache/"){
        
        //Diretório onde queremos guardar os arquivos de cache
        $this->directorio_cache = $diretorio_cache; //Agora vamos começar a contruir uma string que irá conter o nome do script que vamos fazer cache
        
        $this->pagina = $_SERVER['SCRIPT_NAME']."?";
        //se existir uma query string vamos concatenar a mesma com o nome do arquivo
        
        if (isset($_SERVER['QUERY_STRING'])){
        
            $this->pagina=$this->pagina.$_SERVER['QUERY_STRING'];
        
        }
        
    }
    
    function Inicio($tpo_cache = 86400){ //172800 equivalente a 2 dias //86400 a 1 dia
        
        //Gerar o nome do arquivo de cache correspondente à  página que estamos
        
        //O MD5 é só para evitar que o nome contenha careteres inválidos por exemplo ? e & comuns nas query strings
        
        //coloquei a extensão html podem colocar o que quiserem
        
        //limpa o buffer de saída antes de começar a execução
        
        ob_clean();

        if(count($_POST)>0){ return false; } //pra não exibir cache em requisições post
      
        $this->ficheiro_cache = $this->directorio_cache . md5($this->pagina) . '.html';

        //Verificar se o ficheiro já existe na cache
        
        if (file_exists($this->ficheiro_cache)){
            
            if((time() - $tpo_cache) < filemtime($this->ficheiro_cache)){
        
                //se já existir e não for antigo geramos o output deste arquivo
                //ob_start("ob_gzhandler");
                readfile($this->ficheiro_cache);
                //ob_flush();

                //como já fizemos output não queremos que mais nada seja executado!
                
                exit();
            
            }
            //se o tempo não bateu, então já expirou e tenho que deletar o arquivo antigo
            unlink($this->ficheiro_cache);
        
        }
        
        //se chegar aqui é porque o arquivo não existia em cache e temos que o criar
        
        //esta função cria um buffer onde é colocado o outup que é igualmente enviado ao cliente
        
        ob_start();
        //ob_start("ob_gzhandler");
    
    }
    
    function Fim(){

        if(!$this->is_bot() && count($_POST)<1){ //só crio o arquivo se nao for um bot e nao tiver requisicao post

            // Como não exise o arquivo no cache vamos cria-lo e abrir em modo w (w de write)
        
            $fp = fopen($this->ficheiro_cache, 'w');
        
            //Escrevemos o conteudo do buffer no novo ficheiro de cache
        
            @fwrite($fp, ob_get_contents());
        
            //escreve a data e hora do cache, apenas para controle
        
            $hora = date('h:i:s, j-m-Y');
        
            @fwrite($fp, "<!-- Cache - $this->pagina - $hora -->");
        
            //fechamos o file pointer
        
            @fclose($fp);
        }
        
        //e fechamos tambem o buffer criado
        
        ob_end_flush();    
    }

function is_bot()
{ /* testa se o visitante é um bot de busca ou algo do tipo. */
    $bots = array('bot','crawler','spider','scanner','slurp','teoma','twiceler','archiver','robo');
    //takes the list above and returns (google)|(yahoo)|(msn)
    $regex = '('.implode($bots, ')|(').')';
    /*uses the generated regex above to see if those keywords are contained in the user agent variable*/     
    return eregi($regex, $_SERVER['HTTP_USER_AGENT']);
}
    
    function Limpar(){
        
        //ATENÇÃO: Este método apaga TODO o cache. Por isso, seu diretório onde ficam guardados os arquivos de
        //cache não deve conter nenhum outro tipo de dado. Esta função será aprimorada para apagar somente o
        //cache de determinada página
        //criamos um apontador para o diretorio onde esta guardado o cache
        
        if ($handle = $this->directorio_cache){
        
            //um loop que percorre todos os ficheiros
        
            while (false !== ($file = readdir($handle))){
        
            //evitar um erro!!
        
                if ($file != '.' and $file != '..'){
            
                    //somente uma informação
            
                    echo 'Apagado > '.$file . '<br>';
            
                    //apagar cada um dos arquivos
            
                    unlink($this->directorio_cache . '/' . $file);
                }
                
            }
            //fechamos o apontador
            
            closedir($handle);
            
            }
        }
    }
?>

Daí, nos arquivos que quiser cachear é só usar:

Uso antes de abrir o <html>:
  include_once "inc-cache.php";
  $cache = new Cache('./cache/');
  $cache->Inicio(864000);

Após fechar o html
$cache->Fim();

Se tiver vários tipos de página e quiser pastas de cache diferentes pra cada uma delas, sem problema, é só alterar o caminho da pasta aí.

Seu código ficou excelente, porém ele só está gerando o cache da index, poderia me ajudar? Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.