
Miguel92
Alfa
Verificación en dos pasos activada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Hola a todos, estoy intentando "cachear las sentencias sql(mejor dicho el resultado de la sentencia, y no la sentencia misma perdón por eso)", esto para evitar demasiadas consultas a la base de datos, pero me he percatado que por ejemplo, si hay 100 o más posts/comentarios pero se muestra 20 por página al momento de cachear, creo que reemplazaría el archivo con la nueva página en el caso que un usuario navegue con las páginas, y estoy tratando de evitarlo realizando nuevos archivos más la página ejemplo:
sqlcache_funcname.cache (normal página inicial)
sqlcache_funcname_page2.cache (página 2)
sucesivamente...
Ya que estoy tratando de evitar el uso de librerías de terceros.
Código
Tendría como resultado algo así 'root/storage/cacheSQL/' donde se almacenarán los archivos
Algunas explicaciones:
La función sqlCached() se encarga de crear el archivo.
La función getSqlCached() se encarga de verificar la existencia del archivo.
La función setCache() sería la que se encargaría de generar el archivo y de obtener los datos de dicho archivo.
El tema esta en setCache(), espero que me haya explicado de una forma que se pueda entender lo que quiero hacer... y desde ya muchas gracias!
(Esto se encuentra en ZCode[rama main 2.0.14]) Link actualizado a la fecha de hoy 20.03.25
Línea donde se aplica en c.posts.php #203 Link actualizado a la fecha de hoy 20.03.25
El código colocado aquí ya es diferente al de la repo!
sqlcache_funcname.cache (normal página inicial)
sqlcache_funcname_page2.cache (página 2)
sucesivamente...
Ya que estoy tratando de evitar el uso de librerías de terceros.
Código
PHP:
<?php
class sqlCache {
# Nombre de la carpeta donde se almacenarán los archivos
protected $storage = 'cacheSQL';
# Prefijo que tendrán los archivos
protected $prefix = 'sqlcache_';
# La extensión que tendrán los archivos
protected $extension = '.cache';
// El tiempo de actualización de la caché en segundos.
protected $upgrade = 300; # 5 Min.
public function __construct() {
$this->storage = $this->setStorage();
}
private function setStorage() {
$storage = TS_STORAGE . $this->storage . TS_PATH;
if(!is_dir($storage)) {
mkdir($storage, 0777, true);
}
return $storage;
}
private function getTimeSqlCached(string $file = '') {
// Verificar si el archivo existe antes de intentar obtener su tiempo de modificación
if (file_exists($file)) {
return (time() - filemtime($file) < $this->upgrade);
}
return false;
}
public function verifySqlCached(string $cache_key = '') {
return file_exists($this->storage . $this->prefix . $cache_key . $this->extension);
}
public function sqlCached(string $cache_key = '', array $data = []) {
$filename = $this->storage . $this->prefix . $cache_key . $this->extension;
// Comparar el contenido actual de la base de datos con el caché
$isCacheValid = $this->verifySqlCached($cache_key) && $this->getTimeSqlCached($filename);
$currentData = $isCacheValid ? unserialize(file_get_contents($filename)) : null;
if (!$isCacheValid || $currentData !== $data) {
// Guardar los nuevos datos en caché si están obsoletos o diferentes
file_put_contents($filename, serialize($data));
} else {
$data = $currentData; // Mantener los datos actuales si el caché es válido
}
return $data;
}
public function getSqlCached(string $namekey = '') {
$filename = $this->storage . $this->prefix . $namekey . $this->extension;
if ($this->verifySqlCached($namekey) && !$this->getTimeSqlCached($filename)) {
return unserialize(file_get_contents($filename));
} else return null;
}
# No estoy seguro sobre $key .= ....
public function setCache(string $key = '', array $data = [], int $max = 0) {
$key .= ($max !== $page OR $max <= 0) ? '' : "_p{$page}";
if(!$this->verifySqlCached($key)) {
return $this->sqlCached($key, $data);
} else {
return $this->getSqlCached($key);
}
}
/**
* Obtiene los datos almacenados en caché o los genera y almacena en caché si no están disponibles o son obsoletos.
*
* @param string $cacheKey La clave de la caché utilizada para identificar los datos.
* @param int $upgrade El tiempo de expiración de la caché en segundos. Por defecto 3600 (1 hora).
* @return mixed Los datos recuperados de la caché o generados si no están disponibles o son obsoletos.
*/
public function getCachedData($cacheKey) {
// Existe el archivo
if ($this->upgrade && file_exists($cacheFile) && (time() - filemtime($cacheFile) < $upgrade)) {
return unserialize(file_get_contents($cacheFile));
} else {
unlink($cacheFile);
$data = $this->$cacheKey(); # Obtiene el resultado de la funcion
file_put_contents($cacheFile, serialize($data));
return $data;
}
}
}
$sqlCache = new sqlCache;
PHP:
$storage = TS_STORAGE . $this->storage . TS_PATH;
Algunas explicaciones:
La función sqlCached() se encarga de crear el archivo.
La función getSqlCached() se encarga de verificar la existencia del archivo.
La función setCache() sería la que se encargaría de generar el archivo y de obtener los datos de dicho archivo.
El tema esta en setCache(), espero que me haya explicado de una forma que se pueda entender lo que quiero hacer... y desde ya muchas gracias!
(Esto se encuentra en ZCode[rama main 2.0.14]) Link actualizado a la fecha de hoy 20.03.25
Línea donde se aplica en c.posts.php #203 Link actualizado a la fecha de hoy 20.03.25
El código colocado aquí ya es diferente al de la repo!
Última edición: