{"id":233092,"date":"2023-02-03T16:06:00","date_gmt":"2023-02-03T13:06:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233092"},"modified":"2022-11-10T19:22:11","modified_gmt":"2022-11-10T16:22:11","slug":"come-memorizzare-nella-cache-operazioni-pesanti-come-query-di-database-in-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/come-memorizzare-nella-cache-operazioni-pesanti-come-query-di-database-in-php\/","title":{"rendered":"Come memorizzare nella cache operazioni pesanti (come query di database) in PHP?"},"content":{"rendered":"\n<p>PHP \u00e8 un linguaggio di programmazione molto popolare per il web. \u00c8 un linguaggio di programmazione conveniente e potente, liberamente digitato che puoi raccogliere e utilizzare in un breve periodo di tempo. Diventa cos\u00ec ampiamente diffuso e popolare forse grazie a WordPress, un blog o un CMS (Content Management System). Molti siti web come Facebook sono originariamente basati su PHP.<\/p>\n<p>Tuttavia, PHP \u00e8 generalmente considerato un linguaggio di scripting di interpretazione lenta, sebbene ci siano molte tecniche per accelerarlo, ad esempio Zend Optimiser installato per impostazione predefinita. L&#8217; <a href=\"https:\/\/hhvm.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">HHVM<\/a> aiuta a compilare il PHP in fase di esecuzione in qualcosa di simile al bytecode, che pu\u00f2 quindi essere tradotto in codice nativo, migliorando le prestazioni.<\/p>\n<p>Le query al database richiedono molto tempo, soprattutto per le tabelle di grandi dimensioni o le tabelle senza un&#8217;adeguata indicizzazione. A volte, tali operazioni rallenteranno la velocit\u00e0 di caricamento\/elaborazione della pagina e quindi comprometteranno l&#8217;esperienza dell&#8217;utente. Abbastanza spesso, tali query richiedono tempo per essere completate, ma i risultati non cambiano cos\u00ec frequentemente, ad esempio una volta al giorno. In questo caso, \u00e8 meglio memorizzare nella cache questi risultati nei file e farli leggere i file la prossima volta se trovati gi\u00e0 memorizzati nella cache.<\/p>\n<p>Il database MySQL \u00e8 bravo a gestire le query con un&#8217;indicizzazione adeguata. Tuttavia, quando il tavolo diventa grande, influisce sulle prestazioni. Possiamo memorizzare nella cache qualsiasi operazione ad alta intensit\u00e0 di calcolo e archiviarla in file su disco e ottenerla la prossima volta leggendo direttamente dai file, il che sar\u00e0 molto pi\u00f9 veloce.<\/p>\n<p>Abbiamo fornito una classe PHP che pu\u00f2 essere facilmente utilizzata da includere nella tua applicazione.<\/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>Quindi, i commenti sono a posto. La classe di cui sopra \u00e8 semplice e facile da usare. Ad esempio, ho utilizzato quanto segue per memorizzare nella cache una query per il mio sito 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>Quindi, se vogliamo svuotare la cache, possiamo semplicemente eliminarla con:<\/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>Lo <a href=\"https:\/\/helloacm.com\/curl\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">strumento di richiesta dell&#8217;intestazione CURL online<\/a> utilizza questa tecnica della cache per ridurre i carichi della CPU del server Web e questi file della cache verranno eliminati ogni pochi giorni per evitare di sovraccaricare lo spazio su disco nel server Web.<\/p>\n<p>Ricorda, la velocit\u00e0 di caricamento della pagina \u00e8 uno dei fattori che influenzano il tuo punteggio SEO. I motori di ricerca prediligono siti web pi\u00f9 veloci.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/helloacm.com\" class=\"external external_icon\">helloacm.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Come memorizzare nella cache operazioni pesanti (come query di database) in 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":[896,835,751,804,720,844,1089,865],"tags":[1168],"class_list":["post-233092","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-guida-per-principianti","category-open-source-projektmanagement-3","category-php-6","category-sviluppatore","category-tutorial","category-velocita-del-sito","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233092","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=233092"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233092\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/220836"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}