{"id":233024,"date":"2023-02-03T16:30:00","date_gmt":"2023-02-03T13:30:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233024"},"modified":"2022-11-10T18:48:10","modified_gmt":"2022-11-10T15:48:10","slug":"hur-cachelagrar-man-tunga-operationer-som-databasfraagor-i-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/hur-cachelagrar-man-tunga-operationer-som-databasfraagor-i-php\/","title":{"rendered":"Hur cachelagrar man tunga operationer (som databasfr\u00e5gor) i PHP?"},"content":{"rendered":"\n<p>PHP \u00e4r ett mycket popul\u00e4rt programmeringsspr\u00e5k f\u00f6r webben. Det \u00e4r ett bekv\u00e4mt och kraftfullt, l\u00f6st skrivet programmeringsspr\u00e5k som du kan plocka upp och anv\u00e4nda inom en kort tidsperiod. Det blir s\u00e5 mycket spritt och popul\u00e4rt kanske tack vare WordPress, ett bloggande eller CMS (Content Management System). M\u00e5nga webbplatser som Facebook \u00e4r ursprungligen baserade p\u00e5 PHP.<\/p>\n<p>Men PHP anses generellt vara ett l\u00e5ngsamt tolkande skriptspr\u00e5k, \u00e4ven om det finns m\u00e5nga tekniker f\u00f6r att accelerera det, t.ex. Zend Optimiser installerad som standard. HHVM hj\u00e4lper <a href=\"https:\/\/hhvm.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">till<\/a> att kompilera PHP vid k\u00f6rning till n\u00e5got som bytecode, som sedan kan \u00f6vers\u00e4ttas till inbyggd kod, vilket f\u00f6rb\u00e4ttrar prestandan.<\/p>\n<p>Databasfr\u00e5gor \u00e4r tidskr\u00e4vande, s\u00e4rskilt f\u00f6r stora tabeller eller tabeller utan korrekt indexering. Ibland kommer s\u00e5dana operationer att sakta ner sidladdnings-\/bearbetningshastigheten och sedan \u00e4ventyra anv\u00e4ndarupplevelsen. Ganska ofta tar s\u00e5dana fr\u00e5gor tid att slutf\u00f6ra men resultaten kommer inte att \u00e4ndras s\u00e5 ofta, dvs kanske \u00e4ndras en g\u00e5ng om dagen. I det h\u00e4r fallet \u00e4r det b\u00e4ttre att cache dessa resultat i filer och f\u00e5 dem fr\u00e5n att l\u00e4sa filerna n\u00e4sta g\u00e5ng om de hittas redan cachade.<\/p>\n<p>MySQL-databas \u00e4r bra p\u00e5 att hantera fr\u00e5gor med korrekt indexering. Men n\u00e4r bordet blir stort p\u00e5verkar det prestandan. Vi kan cache alla ber\u00e4kningsintensiva operationer och lagra dem i filer p\u00e5 diskar och h\u00e4mta dem n\u00e4sta g\u00e5ng genom att l\u00e4sa direkt fr\u00e5n filerna, vilket kommer att g\u00e5 mycket snabbare.<\/p>\n<p>Vi har tillhandah\u00e5llit en PHP-klass som enkelt kan anv\u00e4ndas f\u00f6r att inkludera i din ans\u00f6kan.<\/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>S\u00e5, kommentarerna \u00e4r p\u00e5 sin plats. Ovanst\u00e5ende klass \u00e4r enkel och l\u00e4tt att anv\u00e4nda. Till exempel har jag anv\u00e4nt f\u00f6ljande f\u00f6r att cachelagra en fr\u00e5ga f\u00f6r min webbplats.<\/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>S\u00e5 om vi vill rensa cacheminnet kan vi helt enkelt ta bort det genom att:<\/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>Online CURL <a href=\"https:\/\/helloacm.com\/curl\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">header request-verktyget<\/a> anv\u00e4nder denna cacheteknik f\u00f6r att minska CPU-belastningen p\u00e5 webbservern, och dessa cachefiler kommer att rensas med n\u00e5gra dagars mellanrum f\u00f6r att f\u00f6rhindra att diskutrymmet p\u00e5 webbservern \u00f6verbelastas.<\/p>\n<p>Kom ih\u00e5g att sidladdningshastigheten \u00e4r en av faktorerna som p\u00e5verkar din SEO-po\u00e4ng. S\u00f6kmotorer f\u00f6redrar snabbare webbplatser.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/helloacm.com\" class=\"external external_icon\">helloacm.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hur cachelagrar man tunga operationer (som databasfr\u00e5gor) i 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":[838,848,901,755,807,724,1092,868],"tags":[1173],"class_list":["post-233024","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-foer-nyboerjare","category-handledningar","category-koda","category-oeppen-kaella","category-php-9","category-utvecklaren","category-webbplatshastighet","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233024","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=233024"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233024\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/220836"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233024"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233024"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}