{"id":233037,"date":"2023-02-03T16:53:00","date_gmt":"2023-02-03T13:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233037"},"modified":"2022-11-10T18:51:52","modified_gmt":"2022-11-10T15:51:52","slug":"como-almacenar-en-cache-operaciones-pesadas-como-consultas-de-bases-de-datos-en-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/como-almacenar-en-cache-operaciones-pesadas-como-consultas-de-bases-de-datos-en-php\/","title":{"rendered":"\u00bfC\u00f3mo almacenar en cach\u00e9 operaciones pesadas (como consultas de bases de datos) en PHP?"},"content":{"rendered":"\n<p>PHP es un lenguaje de programaci\u00f3n muy popular para la web. Es un lenguaje de programaci\u00f3n conveniente y poderoso, de escritura libre que puede aprender y usar en un corto per\u00edodo de tiempo. Se vuelve tan ampliamente difundido y popular tal vez gracias a WordPress, un blog o CMS (Sistema de gesti\u00f3n de contenido). Muchos sitios web, como Facebook, se basan originalmente en PHP.<\/p>\n<p>Sin embargo, PHP generalmente se considera un lenguaje de secuencias de comandos de interpretaci\u00f3n lenta, aunque existen muchas t\u00e9cnicas para acelerarlo, por ejemplo, Zend Optimizer instalado de forma predeterminada. El <a href=\"https:\/\/hhvm.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">HHVM<\/a> ayuda a compilar PHP en tiempo de ejecuci\u00f3n en algo as\u00ed como un c\u00f3digo de bytes, que luego se puede traducir a c\u00f3digo nativo, lo que mejora el rendimiento.<\/p>\n<p>Las consultas a la base de datos consumen mucho tiempo, especialmente para tablas grandes o tablas sin la indexaci\u00f3n adecuada. A veces, tales operaciones ralentizar\u00e1n la velocidad de carga\/procesamiento de la p\u00e1gina y luego comprometer\u00e1n la experiencia del usuario. Muy a menudo, estas consultas tardan en completarse, pero los resultados no cambiar\u00e1n con tanta frecuencia, es decir, pueden cambiar una vez al d\u00eda. En este caso, es mejor almacenar en cach\u00e9 estos resultados en archivos y obtenerlos al leer los archivos la pr\u00f3xima vez si ya se encuentran almacenados en cach\u00e9.<\/p>\n<p>La base de datos MySQL es buena para manejar consultas con una indexaci\u00f3n adecuada. Sin embargo, cuando la tabla se vuelve grande, afecta un poco el rendimiento. Podemos almacenar en cach\u00e9 cualquier operaci\u00f3n de computaci\u00f3n intensiva y almacenarla en archivos en discos y obtenerla la pr\u00f3xima vez leyendo directamente de los archivos, lo que ser\u00e1 mucho m\u00e1s r\u00e1pido.<\/p>\n<p>Hemos proporcionado una clase de PHP que se puede usar f\u00e1cilmente para incluirla en su aplicaci\u00f3n.<\/p>\n<pre><code>class Cache {\n\u00a0 \u00a0 private $folder = '';\n\u00a0 \u00a0 \n\u00a0 \u00a0 \/\/ constructor takes an optional path for storing the cache files\n\u00a0 \u00a0 public function __construct($path = '') {\n\u00a0 \u00a0 \u00a0 \u00a0 $path = trim($path);\n\u00a0 \u00a0 \u00a0 \u00a0 if ((strlen($path) &amp;&amp; is_dir($path))) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $this-&gt;setFolder($path);\n\u00a0 \u00a0 \u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $this-&gt;setFolder('\/tmp\/'); \u00a0 \/\/ tmp folder if empty\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \n\u00a0 \u00a0 public function getFolder() {\n\u00a0 \u00a0 \u00a0 \u00a0 return $this-&gt;folder; \u00a0\n\u00a0 \u00a0 } \u00a0 \u00a0\n\u00a0 \u00a0 \n\u00a0 \u00a0 public function setFolder($path) {\n\u00a0 \u00a0 \u00a0 \u00a0 $path = trim($path);\n\u00a0 \u00a0 \u00a0 \u00a0 $len = strlen($path);\n\u00a0 \u00a0 \u00a0 \u00a0 if ($len) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (is_dir($path)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($path[$len - 1] != '\/') {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $path .= '\/'; \u00a0\/\/ adds a forward slashes at the end\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $this-&gt;folder = $path;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0\n\u00a0 \u00a0 \/\/ read from caches, if not found, return null\n\u00a0 \u00a0 public function read($fileName) {\n\u00a0 \u00a0 \u00a0 \u00a0 $fileName = $this-&gt;folder.$fileName;\n\u00a0 \u00a0 \u00a0 \u00a0 if (is_file($fileName)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $handle = fopen($fileName, 'rb'); \/\/ open as binary\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $variable = fread($handle, filesize($fileName));\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 fclose($handle);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return unserialize($variable);\n\u00a0 \u00a0 \u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return null;\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \/\/ write $variable to $fileName\n\u00a0 \u00a0 public function write($fileName, $variable) {\n\u00a0 \u00a0 \u00a0 \u00a0 $fileName = $this-&gt;folder.$fileName;\n\u00a0 \u00a0 \u00a0 \u00a0 $handle = fopen($fileName, 'a');\n\u00a0 \u00a0 \u00a0 \u00a0 fwrite($handle, serialize($variable));\n\u00a0 \u00a0 \u00a0 \u00a0 fclose($handle);\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \/\/ delete cache entry $fileName\n\u00a0 \u00a0 public function delete($fileName) {\n\u00a0 \u00a0 \u00a0 \u00a0 $fileName = $this-&gt;folder.$fileName;\n\u00a0 \u00a0 \u00a0 \u00a0 @unlink($fileName); \u00a0\/\/ put a @ to avoid file-not-found warning\n\u00a0 \u00a0 }\n}<\/code><\/pre>\n<p>Entonces, los comentarios est\u00e1n en su lugar. La clase anterior es sencilla y f\u00e1cil de usar. Por ejemplo, he usado lo siguiente para almacenar en cach\u00e9 una consulta para mi sitio web.<\/p>\n<pre><code>\u00a0 \u00a0 require('class.cache.php');\n\u00a0 \u00a0 $cache = new Cache('cache\/1\/');\n\u00a0 \u00a0 $entry = md5($url);\n\u00a0 \u00a0 $data = $cache-&gt;read($entry);\n\u00a0 \u00a0 $blogtitle = \"\";\n\u00a0 \u00a0 if ($data !== null) { \/\/ found cache\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $blogtitle = $data; \/\/ read the data\n\u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 $query = \"select `title` from `blog` where `path`='$url'\";\n\u00a0 \u00a0 \u00a0 $result = mysql_query($query, $link);\n\u00a0\n\u00a0 \u00a0 \u00a0 if (mysql_num_rows($result))\n\u00a0 \u00a0 \u00a0 {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $blogtitle = mysql_result($result, 0, 0);\n\u00a0 \u00a0 \u00a0 } \n\u00a0 \u00a0 \u00a0 $cache-&gt;write($entry, $blogtitle); \u00a0\/\/ save the cache for next read \n\u00a0 \u00a0 }<\/code><\/pre>\n<p>Entonces, si queremos borrar el cach\u00e9, simplemente podemos eliminarlo de la siguiente manera:<\/p>\n<pre><code>\u00a0 \u00a0 \/\/ suppose we run here the query (\"update `blog` set `title` = 'test' where `path` = '$url'\");\n\u00a0 \u00a0 require('class.cache.php');\n\u00a0 \u00a0 $cache = new Cache('cache\/1\/');\n\u00a0 \u00a0 $entry = md5($url);\n\u00a0 \u00a0 $cache-&gt;delete($entry);<\/code><\/pre>\n<p>La <a href=\"https:\/\/helloacm.com\/curl\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">herramienta de solicitud de encabezado CURL en l\u00ednea<\/a> utiliza esta t\u00e9cnica de cach\u00e9 para reducir las cargas de CPU del servidor web, y estos archivos de cach\u00e9 se purgar\u00e1n cada pocos d\u00edas para evitar sobrecargar el espacio en disco en el servidor web.<\/p>\n<p>Recuerde, la velocidad de carga de la p\u00e1gina es uno de los factores que afectan su puntaje de SEO. Los motores de b\u00fasqueda favorecen sitios web m\u00e1s r\u00e1pidos.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/helloacm.com\" class=\"external external_icon\">helloacm.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfC\u00f3mo almacenar en cach\u00e9 operaciones pesadas (como consultas de bases de datos) en PHP?<\/p>\n","protected":false},"author":1,"featured_media":220836,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,747,831,800,840,1085,861],"tags":[1172],"class_list":["post-233037","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-fuente-abierta","category-guia-para-principiantes","category-php-2","category-tutoriales","category-velocidad-del-sitio","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233037"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233037\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/220836"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}