¿Cómo almacenar en caché operaciones pesadas (como consultas de bases de datos) en PHP?
PHP es un lenguaje de programación muy popular para la web. Es un lenguaje de programación conveniente y poderoso, de escritura libre que puede aprender y usar en un corto período de tiempo. Se vuelve tan ampliamente difundido y popular tal vez gracias a WordPress, un blog o CMS (Sistema de gestión de contenido). Muchos sitios web, como Facebook, se basan originalmente en PHP.
Sin embargo, PHP generalmente se considera un lenguaje de secuencias de comandos de interpretación lenta, aunque existen muchas técnicas para acelerarlo, por ejemplo, Zend Optimizer instalado de forma predeterminada. El HHVM ayuda a compilar PHP en tiempo de ejecución en algo así como un código de bytes, que luego se puede traducir a código nativo, lo que mejora el rendimiento.
Las consultas a la base de datos consumen mucho tiempo, especialmente para tablas grandes o tablas sin la indexación adecuada. A veces, tales operaciones ralentizarán la velocidad de carga/procesamiento de la página y luego comprometerán la experiencia del usuario. Muy a menudo, estas consultas tardan en completarse, pero los resultados no cambiarán con tanta frecuencia, es decir, pueden cambiar una vez al día. En este caso, es mejor almacenar en caché estos resultados en archivos y obtenerlos al leer los archivos la próxima vez si ya se encuentran almacenados en caché.
La base de datos MySQL es buena para manejar consultas con una indexación adecuada. Sin embargo, cuando la tabla se vuelve grande, afecta un poco el rendimiento. Podemos almacenar en caché cualquier operación de computación intensiva y almacenarla en archivos en discos y obtenerla la próxima vez leyendo directamente de los archivos, lo que será mucho más rápido.
Hemos proporcionado una clase de PHP que se puede usar fácilmente para incluirla en su aplicación.
class Cache {
private $folder = '';
// constructor takes an optional path for storing the cache files
public function __construct($path = '') {
$path = trim($path);
if ((strlen($path) && is_dir($path))) {
$this->setFolder($path);
} else {
$this->setFolder('/tmp/'); // tmp folder if empty
}
}
public function getFolder() {
return $this->folder;
}
public function setFolder($path) {
$path = trim($path);
$len = strlen($path);
if ($len) {
if (is_dir($path)) {
if ($path[$len - 1] != '/') {
$path .= '/'; // adds a forward slashes at the end
}
$this->folder = $path;
}
}
}
// read from caches, if not found, return null
public function read($fileName) {
$fileName = $this->folder.$fileName;
if (is_file($fileName)) {
$handle = fopen($fileName, 'rb'); // open as binary
$variable = fread($handle, filesize($fileName));
fclose($handle);
return unserialize($variable);
} else {
return null;
}
}
// write $variable to $fileName
public function write($fileName, $variable) {
$fileName = $this->folder.$fileName;
$handle = fopen($fileName, 'a');
fwrite($handle, serialize($variable));
fclose($handle);
}
// delete cache entry $fileName
public function delete($fileName) {
$fileName = $this->folder.$fileName;
@unlink($fileName); // put a @ to avoid file-not-found warning
}
}
Entonces, los comentarios están en su lugar. La clase anterior es sencilla y fácil de usar. Por ejemplo, he usado lo siguiente para almacenar en caché una consulta para mi sitio web.
require('class.cache.php');
$cache = new Cache('cache/1/');
$entry = md5($url);
$data = $cache->read($entry);
$blogtitle = "";
if ($data !== null) { // found cache
$blogtitle = $data; // read the data
} else {
$query = "select `title` from `blog` where `path`='$url'";
$result = mysql_query($query, $link);
if (mysql_num_rows($result))
{
$blogtitle = mysql_result($result, 0, 0);
}
$cache->write($entry, $blogtitle); // save the cache for next read
}
Entonces, si queremos borrar el caché, simplemente podemos eliminarlo de la siguiente manera:
// suppose we run here the query ("update `blog` set `title` = 'test' where `path` = '$url'");
require('class.cache.php');
$cache = new Cache('cache/1/');
$entry = md5($url);
$cache->delete($entry);
La herramienta de solicitud de encabezado CURL en línea utiliza esta técnica de caché para reducir las cargas de CPU del servidor web, y estos archivos de caché se purgarán cada pocos días para evitar sobrecargar el espacio en disco en el servidor web.
Recuerde, la velocidad de carga de la página es uno de los factores que afectan su puntaje de SEO. Los motores de búsqueda favorecen sitios web más rápidos.