Cache de consultas mysql
cache.class.php
class Cache {
/**
* Tempo padrão de cache
*
* @var string
*/
// 1 week 2 days 4 hours 2 seconds
var $time = '5 minutes';
/**
* Local onde o cache será salvo
*
* Definido pelo construtor
*
* @var string
*/
var $folder = "cache";
/**
* 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() {
$this->setFolder(!is_null($this->folder) ? $this->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
*/
public 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
*/
public function generateFileLocation($key) {
return $this->folder . DIRECTORY_SEPARATOR . $this->generateFileName($key) . '.tmp';
}
public function generateFileName($key) {
return md5($key);
}
/**
* 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;
}
}
require_once("cache.class.php");class MySQL
{
var $conectado;
var $servidor;
var $usuario;
var $senha;
var $banco;
var $cache;
public function __construct($servidor,$usuario,$senha,$banco){
$this->servidor = $servidor;
$this->usuario = $usuario;
$this->senha = $senha;
$this->banco = $banco;
$this->cache = new Cache();
}
public function desconectar(){
$this->conectado = false;
return mysql_close();
}
private function conecta(){ echo "conecto";
$this->conectado=mysql_connect($this->servidor,$this->usuario,$this->senha);
if(!$this->conectado){
$this->geraLog("Falha na conexão com o Banco de Dados!");
}elseif(!mysql_select_db($this->banco)){
$this->geraLog("O Bando de Dados solicitado não pode ser aberto!");
}
}
//Esta função executa uma Query, esta funcao SEMPRE IRÁ RETORNAR UMA ARRAY.
public function mysql_query($sql, $time = null){
$key = $this->cache->generateFileName($sql);
$ret = $this->cache->read($key);
if (!$ret) {
if(!$this->conectado){
$this->conecta();
}
$ret = array();
$query = mysql_query($sql);
if($query){
while ($dados = mysql_fetch_assoc($query)) {
$ret[] = $dados;
}
$this->mysql_free_result($query);
$this->cache->save($key, $ret, (is_null($time) ? $this->cache->time : $time));
}else{
$this->geraLog("Ocorreu um erro na execução da SQL");
}
}
return $ret;
}
private function geraLog($erro){
$aux = date("d/m/Y") . " | ";
$aux .= date("H:i:s") . " | ";
$aux .= mysql_error() . " | ";
$aux .= $erro;
$aux .= "\r\n";
error_log($aux, 3, "c:\my-errors.log");
echo $aux;
}
public function mysql_num_rows( $query ) {
if (@is_array($query)){
return count($query);
}else{
return mysql_num_rows( $query );
}
}
public function mysql_free_result($sql){
return mysql_free_result($sql);
}
public function mysql_fetch_assoc($seila) {
global $queryCache;
if (count($queryCache)>0){
foreach ($queryCache as $j=>$i){
unset($queryCache[$j]);
return $i;
}
}
}
}
$mySQL = new MySQL("localhost","usuario","senha","mysql");
//$arr = new ArrayObject();
$sql = "SELECT * FROM user;";
$queryCache = $mySQL->mysql_query($sql);
$total = $mySQL->mysql_num_rows($queryCache);
while ($dados = $mySQL->mysql_fetch_assoc($queryCache)){
print_r($dados);
}
Seguinte, acima existem 2 classes, uma que grava uma array em cache, retorna o que está em cache em forma de array,...
A outra classe faz a conexão com o banco e verifica se a consulta está em cache, se tiver retorna uma array com os registros da consulta.
O PROBLEMA É QUE, USANDO A MINHA LÓGICA O mysql_query SEMPRE TERÁ QUE RETORNAR O VALOR PARA A VARIAVEL COM O NOME "$queryCache", pois no mysql_fetch_assoc a variável "$queryCache" está declarada como global, eu gostaria que essa situação não acontecesse.
Acho que não expliquei direito, caso alguem não tenha entendido poste aqui sua dúvida.
Discussão (14)
Carregando comentários...