Cache é uma forma de armazenar um valor para um consulta futura mais rápida. Com o cache conseguimos otimizar o carregamento dos sites e de suas informações.

Suponhamos que você tenha um site que faça uma consulta em um tabela do banco de dados que possua 3.000.000 registros e essa consulta demore mais de 30 segundos (acredite, isso acontece). Com o cache você pode reduzir esse tempo em alguns segundos.

Cachear uma informação significa salvá-la em algum lugar (seja em um arquivo ou diretamente na memória RAM do servidor) para depois poder consultar essa informação sem ter que obtê-la da forma mais demorada (no exemplo a cima, com a consulta ao banco de dados).

Vamos criar aqui uma classe que servirá para armazenar qualquer tipo de texto, variável, número inteiro, resultado SQL e etc.

Código PHP:
<?php
 
/**
 * Sistema de cache
 *
 * @author Thiago Belem
 */
class Cache {
        private static 
$time = '5 minutes'; //Tempo padrão de cache
       
        
private $folder; //Local onde o cache será salvo | Definido pelo construtor
 
        /**
         * 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;
        }
}
 
?>
Usando o sistema de cache
Veja um exemplo de uso do sistema de cache onde primeiro verificamos se há um valor armazenado no cache e, se não houver, geramos o valor novamente e salvamos ele no cache para futuras verificações:
Código PHP:
<?php
// Verifica se a frase já está no cache
$cache = new Cache();
$frase = $cache->read('frase-dia');
// Se não houver frase no cache ou já tiver expirado
if (!$frase) {
    
// Cria uma nova frase e salva-a no cache por 30s
    
$frase = 'CALMA! O sábio jamais se aborrece ('. date('H:i:s') .')';
    
$cache->save('frase-dia', $frase, '30 seconds');
}
echo 
"<p>{$frase}</p>";
?>
Fonte: Blog Thiago Belem