{"id":234163,"date":"2023-02-03T16:07:00","date_gmt":"2023-02-03T13:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234163"},"modified":"2022-11-11T22:36:09","modified_gmt":"2022-11-11T19:36:09","slug":"comment-mettre-en-cache-les-operations-lourdes-telles-que-les-requetes-de-base-de-donnees-en-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/comment-mettre-en-cache-les-operations-lourdes-telles-que-les-requetes-de-base-de-donnees-en-php\/","title":{"rendered":"Comment mettre en cache les op\u00e9rations lourdes (telles que les requ\u00eates de base de donn\u00e9es) en PHP\u00a0?"},"content":{"rendered":"\n<p>PHP est un langage de programmation tr\u00e8s populaire pour le Web. Il s&rsquo;agit d&rsquo;un langage de programmation pratique et puissant, faiblement typ\u00e9, que vous pouvez ma\u00eetriser et utiliser en peu de temps. Il devient tellement r\u00e9pandu et populaire peut-\u00eatre gr\u00e2ce \u00e0 WordPress, un blog ou un CMS (Content Management System). De nombreux sites Web tels que Facebook sont \u00e0 l&rsquo;origine bas\u00e9s sur PHP.<\/p>\n<p>Cependant, PHP est g\u00e9n\u00e9ralement consid\u00e9r\u00e9 comme un langage de script \u00e0 interpr\u00e9tation lente, bien qu&rsquo;il existe de nombreuses techniques pour l&rsquo;acc\u00e9l\u00e9rer, par exemple Zend Optimiser install\u00e9 par d\u00e9faut. Le <a href=\"https:\/\/hhvm.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">HHVM<\/a> aide \u00e0 compiler le PHP au moment de l&rsquo;ex\u00e9cution en quelque chose comme un bytecode, qui peut ensuite \u00eatre traduit en code natif, ce qui am\u00e9liore les performances.<\/p>\n<p>Les requ\u00eates de base de donn\u00e9es prennent du temps, en particulier pour les grandes tables ou les tables sans indexation appropri\u00e9e. Parfois, de telles op\u00e9rations ralentissent la vitesse de chargement\/traitement de la page, puis compromettent l&rsquo;exp\u00e9rience utilisateur. Tr\u00e8s souvent, de telles requ\u00eates prennent du temps \u00e0 se terminer, mais les r\u00e9sultats ne changeront pas aussi souvent, c&rsquo;est-\u00e0-dire qu&rsquo;ils seront peut-\u00eatre modifi\u00e9s une fois par jour. Dans ce cas, il est pr\u00e9f\u00e9rable de mettre en cache ces r\u00e9sultats dans des fichiers et de les r\u00e9cup\u00e9rer en lisant les fichiers la prochaine fois s&rsquo;ils sont d\u00e9j\u00e0 mis en cache.<\/p>\n<p>La base de donn\u00e9es MySQL est efficace pour g\u00e9rer les requ\u00eates avec une indexation appropri\u00e9e. Cependant, lorsque la table devient grande, cela affecte un peu les performances. Nous pouvons mettre en cache toutes les op\u00e9rations gourmandes en calculs et les stocker dans des fichiers sur des disques et les obtenir la prochaine fois en lisant directement \u00e0 partir des fichiers, ce qui sera beaucoup plus rapide.<\/p>\n<p>Nous avons fourni une classe PHP qui peut \u00eatre facilement utilis\u00e9e pour \u00eatre incluse dans votre application.<\/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>Donc, les commentaires sont en place. La classe ci-dessus est simple et facile \u00e0 utiliser. Par exemple, j&rsquo;ai utilis\u00e9 ce qui suit pour mettre en cache une requ\u00eate pour mon site 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>Donc, si nous voulons vider le cache, nous pouvons simplement le supprimer en :<\/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>L&rsquo; <a href=\"https:\/\/helloacm.com\/curl\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">outil de demande d&rsquo;en-t\u00eate CURL en ligne<\/a> utilise cette technique de cache pour r\u00e9duire les charges CPU du serveur Web, et ces fichiers de cache seront purg\u00e9s tous les quelques jours pour \u00e9viter de surcharger l&rsquo;espace disque du serveur Web.<\/p>\n<p>N&rsquo;oubliez pas que la vitesse de chargement des pages est l&rsquo;un des facteurs qui affectent votre score SEO. Les moteurs de recherche favorisent les sites Web plus rapides.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/helloacm.com\" class=\"external external_icon\">helloacm.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comment mettre en cache les op\u00e9rations lourdes (telles que les requ\u00eates de base de donn\u00e9es) en PHP\u00a0?<\/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":[893,717,832,748,801,841,1086,862],"tags":[1167],"class_list":["post-234163","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-open-source-projektmanagement-2","category-php-3","category-tutoriels","category-vitesse-du-site","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234163","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234163"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234163\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/220836"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}