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