{"id":233051,"date":"2023-02-03T16:59:00","date_gmt":"2023-02-03T13:59:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233051"},"modified":"2022-11-10T18:55:41","modified_gmt":"2022-11-10T15:55:41","slug":"como-armazenar-em-cache-operacoes-pesadas-como-consultas-de-banco-de-dados-em-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-armazenar-em-cache-operacoes-pesadas-como-consultas-de-banco-de-dados-em-php\/","title":{"rendered":"Como armazenar em cache opera\u00e7\u00f5es pesadas (como consultas de banco de dados) em PHP?"},"content":{"rendered":"\n<p>PHP \u00e9 uma linguagem de programa\u00e7\u00e3o muito popular para a web. \u00c9 uma linguagem de programa\u00e7\u00e3o conveniente e poderosa, de tipo flex\u00edvel, que voc\u00ea pode pegar e usar em um curto per\u00edodo de tempo. Ele fica muito difundido e popular, talvez gra\u00e7as ao WordPress, um blog ou CMS (Content Management System). Muitos sites como o facebook s\u00e3o originalmente baseados em PHP.<\/p>\n<p>No entanto, o PHP \u00e9 geralmente considerado uma linguagem de script de interpreta\u00e7\u00e3o lenta, embora existam muitas t\u00e9cnicas para aceler\u00e1-lo, por exemplo, o Zend Optimizer instalado por padr\u00e3o. O <a href=\"https:\/\/hhvm.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">HHVM<\/a> ajuda a compilar o PHP em tempo de execu\u00e7\u00e3o em algo como bytecode, que pode ser traduzido em c\u00f3digo nativo, o que melhora o desempenho.<\/p>\n<p>As consultas de banco de dados s\u00e3o demoradas, especialmente para tabelas grandes ou tabelas sem indexa\u00e7\u00e3o adequada. \u00c0s vezes, essas opera\u00e7\u00f5es diminuem a velocidade de carregamento\/processamento da p\u00e1gina e comprometem a experi\u00eancia do usu\u00e1rio. Muitas vezes, essas consultas levam tempo para serem conclu\u00eddas, mas os resultados n\u00e3o mudam com tanta frequ\u00eancia, ou seja, talvez sejam alterados uma vez por dia. Nesse caso, \u00e9 melhor armazenar em cache esses resultados em arquivos e obt\u00ea-los da pr\u00f3xima vez que ler os arquivos, se j\u00e1 estiverem armazenados em cache.<\/p>\n<p>O banco de dados MySQL \u00e9 bom para lidar com consultas com indexa\u00e7\u00e3o adequada. No entanto, quando a tabela fica grande, isso afeta o desempenho. Podemos armazenar em cache quaisquer opera\u00e7\u00f5es de computa\u00e7\u00e3o intensiva e armazen\u00e1-las em arquivos em discos e obt\u00ea-las da pr\u00f3xima vez lendo diretamente dos arquivos, o que ser\u00e1 muito mais r\u00e1pido.<\/p>\n<p>Fornecemos uma classe PHP que pode ser facilmente usada para incluir em seu aplicativo.<\/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>Ent\u00e3o, os coment\u00e1rios est\u00e3o no lugar. A classe acima \u00e9 simples e f\u00e1cil de usar. Por exemplo, usei o seguinte para armazenar em cache uma consulta para meu site.<\/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>Ent\u00e3o, se quisermos limpar o cache, podemos simplesmente exclu\u00ed-lo:<\/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>A <a href=\"https:\/\/helloacm.com\/curl\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ferramenta de solicita\u00e7\u00e3o de cabe\u00e7alho CURL on<\/a> -line usa essa t\u00e9cnica de cache para reduzir as cargas da CPU do servidor da Web, e esses arquivos de cache ser\u00e3o limpos a cada poucos dias para evitar sobrecarregar o espa\u00e7o em disco no servidor da Web.<\/p>\n<p>Lembre-se, a velocidade de carregamento da p\u00e1gina \u00e9 um dos fatores que afetam sua pontua\u00e7\u00e3o de SEO. Os motores de busca favorecem sites mais r\u00e1pidos.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/helloacm.com\" class=\"external external_icon\">helloacm.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como armazenar em cache opera\u00e7\u00f5es pesadas (como consultas de banco de dados) em 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":[898,753,722,837,806,846,1091,867],"tags":[1170],"class_list":["post-233051","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-codigo-aberto","category-desenvolvedor","category-guia-para-iniciantes","category-php-8","category-tutoriais","category-velocidade-do-site","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233051"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233051\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/220836"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}