Criando uma classe para Cache com PHP

Nessa video aula vou mostrar como criar uma classe para trabalhar com cache com PHP. E com isso veremos um pouco de interface, classe abstract, personalizar uma exception etc. Espero que gostem, e boa aula.

Código da Vídeo Aula:

IFile.class.php

    <?php 
            interface IFile{
                public function write($key, $value);
                public function read($key);
            }
    ?>

AbstractFile.class.php

    <?php 
            abstract class AbstractFile implements IFile{
           }
    ?>

CacheException.class.php

    <?php 
            class CacheException extends Exception{}
    ?>

Cache.class.php


    <?php 

            class Cache extends AbstractFile{
                    protected $folder;
                    protected $timeout;
                    protected $ext;
                    
                    public function __construct($timeout = 60, $folder = 'cache', $ext = 'txt'){
                            $this->timeout = $timeout;
                            $this->folder = $folder;
                            $this->ext  = $ext;
                    }
                    
                    public function getPathFileName($key){
                        return sprintf('%s/%s.%s', $this->folder, md5($key), $this->ext);
                    }
                    
                    private function exists($filename){
                        return file_exists($filename);
                    }
                    
                    public function isCache($key){
                        $filename = $this->getPathFileName($key);
                        if(!$this->exists($filename)){
                            return true;
                        }
                        $filemtime = filemtime($filename);
                        if(time() > ($filemtime + (60 * $this->timeout))){
                            return true;
                        }
                        return false;
                    }
                    
                    public function write($key, $value){
                         $filename = $this->getPathFileName($key);
                         if(!file_put_contents($filename, $value)){
                            throw new CacheException(' Esse arquivo não foi possivel gravar algum valor :'.$key);
                         }
                    }
                    
                    public function read($key){
                            $filename = $this->getPathFileName($key);
                            if($this->exists($filename)){
                                if(!$result = file_get_contents($filename)){
                                    throw new CacheException(' Esse arquivo não foi possivel ler  :'.$key);
                                }
                                return $result;
                            }
                    }
            }
    ?>

index.php

    <?php 
            function __autoload($classe){
                require_once("classes/$classe.class.php");
            }
    try{
        $cache  = new Cache();
        if($cache->isCache('feed')){
            $cache->write('feed', 'Hora '.date('H:i:s'));
        }
        echo $cache->read('feed');
        
        }catch(CacheException $e){
            echo $e->getMessage();
    }
?>
     



Se o conteúdo foi relevante para você, e desejar, você pode incentivar fazendo uma doação.

10 thoughts on “Criando uma classe para Cache com PHP

  1. Olá David sempre vejo suas dicas, mas estou com problemas em fazer um site fica com cache no servidor sem o cache está consomindo +ou- 26 mil requisições testei neste site: http://loadimpact.com/ claro é só um teste, mas tentei achar algo na internet que desse pra adpatar no projeto, mas sem sucesso, tentei essa sua vídeo aula e tb nada você teria algo específico para cachear página do site?

    desde já agradeço sua atenção
    abraços

    1. Regis, eu te respondi no outro blog meu, não sei se vc chegou a ler, mas vou deixar aqui a mesma resposta (tem um código de exemplo):

      a ideia do cache é ter uma copia do resultado final q será mostrado para o usuário, se ter q repetir o processo de criação dessa pagina, exemplo:

      – Vc acessa uma página.
      – Se tiver algo que tenha que interpretado ( PHP), ele fará os processos, e consultas no banco de dados.
      – Depois ele retorna o conteúdo em texto, e o que você vê quando ver o código fonte.

      O trabalhar com cache vai apenas simplificar esse processo. Em vez de sempre interpreta o PHP, ele faz apenas uma vez (de acordo com tempo q vc determinar), ele cria o cache ( o resultado do código interpretado), e chama esse cache.

      Um exemplo pra usar trechos de código pela classe:

      http://pastebin.com/hn1dbUhh

      E aqui seria a utilização :

      http://pastebin.com/ebJj1LzS

      Obs:. Eu não testei essa classe, apenas uma demonstração como poderia ser feito.

      1. Só acrescentando, eu fiz o teste do q vc fez, no caso seu problema não cache, e sim muitos requisições externas, vc tem pode utilizar tecnicas, com juntar todos os arquivos css em um só, tbm junto os Javascript. Utilize CSS sprint pra juntar imagens pequenas, isso diminui a requisição. Depois de fazer manipulação do frontend, ai vc parte para o cache de página.

          1. Mostrei com fazer cache de um conteúdo, utilizei as horas por ser algo mais fácil de visualizar, vc pode utilizar algo assim:

            http://pastebin.com/KpE9eyn6

            Claro q vc utilizar uma classe Template, tenho uma videoaula falando sobre isso, talvez ficaria mais organizado pra cachear a página

  2. Olá David!
    Primeiramente gostaria de te parabenizar pela, foi a melhor que eu achei até agora! Estou precisando fazer o uso de cache em um site de um cliente, porém preciso fazer cache das imagens. Utilizei essa classe que você fez e deu certo, mas me ficou uma duvida. Se eu utilizo o método read() com a imagem, ele retorna uma string que é o que representaria a imagem. Então resolvi colocar no src da imagem o getPathFileName(), que é o path da imagem que foi feita o cache. Bom, funcionar funciona, mas isso seria o ideal?? Outra pergunta, como faço para pegar o diretório temporário do Sistema?? Existe uma função em php, como por exemplo o getcwd() que pega o diretório atual, que localize ele ou terei que digita-lo a mão mesmo?
    Grato desde já!

    1. Olá Rafael, então, o cache de imagem, vc está redimensionando no HTML ? Se for tem o timthumb.

      A ideia do cache é o que for dinâmico, onde tem um processamento, como consulta ao banco de dados, consulta externa, vc transformar o resultado estático, e chamar esse resultado. No caso de imagens, acho esse cache valeria se vc tiver imagem grande, e vc quisesse redimensionar em vários tamanho na hora da exibição. Mas como fazer isso via html não diminuirá o tamanho, então usar o timthumb é uma solução interessante.

      1. Obrigado pela Resposta David! O cache com a imagem era para aumentar a velocidade de carregamento da página, já que a mesma possui várias imagens. Consegui fazer o cache de imagens com uma configuração no arquivo .htaccess, apesar do servidor da minha cliente estar com algum tipo de configuração que, aparentemente, mesmo com o cache configurado, ele faz uma nova requisição dos arquivos. Mas a sua classe me fui muito útil! Estarei estudando ela e tentarei fazer algumas modificações! Mais uma vez agradeço pela resposta!

        1. Provavelmente vc ter habilitado o etags. A ideia principal pra melhorar o carregamento do site, é tentar diminuir as requisições http. Q bom a classe pode te ajudar.

  3. Olá david, aula muito boa, mais tou com uma dulvida , como eu faço pra usar esse sistema de cache em minhas paginas php, tipo cadastro.php,index.php como eu faria?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *