{"id":233048,"date":"2023-02-03T16:20:00","date_gmt":"2023-02-03T13:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233048"},"modified":"2022-11-10T18:54:57","modified_gmt":"2022-11-10T15:54:57","slug":"kuinka-tallentaa-vaelimuistiin-raskaat-toiminnot-kuten-tietokantakyselyt-php-ssae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/kuinka-tallentaa-vaelimuistiin-raskaat-toiminnot-kuten-tietokantakyselyt-php-ssae\/","title":{"rendered":"Kuinka tallentaa v\u00e4limuistiin raskaat toiminnot (kuten tietokantakyselyt) PHP:ss\u00e4?"},"content":{"rendered":"\n<p>PHP on eritt\u00e4in suosittu ohjelmointikieli verkossa. Se on k\u00e4tev\u00e4 ja tehokas, l\u00f6yh\u00e4sti kirjoitettu ohjelmointikieli, jonka voit ottaa k\u00e4ytt\u00f6\u00f6n ja k\u00e4ytt\u00e4\u00e4 lyhyess\u00e4 ajassa. Se tulee niin laajalle levinneeksi ja suosituksi ehk\u00e4 WordPressin, bloggaamisen tai CMS:n (Content Management System) ansiosta. Monet verkkosivustot, kuten facebook, perustuvat alun perin PHP:hen.<\/p>\n<p>PHP:t\u00e4 pidet\u00e4\u00e4n kuitenkin yleisesti hitaasti tulkitsevana komentosarjakielen\u00e4, vaikka sen nopeuttamiseen on monia tekniikoita, esim. oletuksena asennettuna Zend Optimiser. HHVM auttaa <a href=\"https:\/\/hhvm.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">k\u00e4\u00e4nt\u00e4m\u00e4\u00e4n<\/a> PHP:n ajon aikana esimerkiksi tavukoodiksi, joka voidaan sitten k\u00e4\u00e4nt\u00e4\u00e4 alkuper\u00e4iseksi koodiksi, mik\u00e4 parantaa suorituskyky\u00e4.<\/p>\n<p>Tietokantakyselyt ovat aikaa vievi\u00e4, etenkin suurille taulukoille tai taulukoille ilman asianmukaista indeksointia. Joskus t\u00e4llaiset toiminnot hidastavat sivun lataus-\/k\u00e4sittelynopeutta ja vaarantavat sitten k\u00e4ytt\u00f6kokemuksen. Melko usein t\u00e4llaisten kyselyiden suorittaminen vie aikaa, mutta tulokset eiv\u00e4t muutu niin usein, ts. saattavat muuttua kerran p\u00e4iv\u00e4ss\u00e4. T\u00e4ss\u00e4 tapauksessa on parempi tallentaa n\u00e4m\u00e4 tulokset tiedostoihin ja saada ne lukemaan tiedostoja seuraavan kerran, jos ne l\u00f6ytyv\u00e4t jo v\u00e4limuistista.<\/p>\n<p>MySQL-tietokanta on hyv\u00e4 k\u00e4sittelem\u00e4\u00e4n kyselyit\u00e4 asianmukaisella indeksill\u00e4. Kuitenkin, kun p\u00f6yt\u00e4 kasvaa suureksi, se vaikuttaa suorituskykyyn. Voimme tallentaa v\u00e4limuistiin mit\u00e4 tahansa laskentaa vaativia operaatioita ja tallentaa ne tiedostoiksi levyille ja saada ne seuraavan kerran lukemalla suoraan tiedostoista, mik\u00e4 on paljon nopeampaa.<\/p>\n<p>Olemme tarjonneet PHP-luokan, jota voidaan helposti k\u00e4ytt\u00e4\u00e4 hakemukseesi sis\u00e4llytt\u00e4misess\u00e4.<\/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>Kommentit ovat siis paikallaan. Yll\u00e4 oleva luokka on suoraviivainen ja helppok\u00e4ytt\u00f6inen. Olen esimerkiksi k\u00e4ytt\u00e4nyt seuraavaa yhden verkkosivustoni kyselyn v\u00e4limuistiin.<\/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>Joten jos haluamme tyhjent\u00e4\u00e4 v\u00e4limuistin, voimme yksinkertaisesti poistaa sen seuraavasti:<\/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 &#8211; <a href=\"https:\/\/helloacm.com\/curl\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">CURL-otsikkopyynt\u00f6ty\u00f6kalu<\/a> k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 v\u00e4limuistitekniikkaa web-palvelimen suorittimen kuormituksen v\u00e4hent\u00e4miseen, ja n\u00e4m\u00e4 v\u00e4limuistitiedostot tyhjennet\u00e4\u00e4n muutaman p\u00e4iv\u00e4n v\u00e4lein, jotta verkkopalvelimen levytila \u200b\u200bei ylikuormittaisi.<\/p>\n<p>Muista, ett\u00e4 sivun latausnopeus on yksi SEO-pisteeseesi vaikuttavista tekij\u00f6ist\u00e4. Hakukoneet suosivat nopeampia verkkosivustoja.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/helloacm.com\" class=\"external external_icon\">helloacm.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kuinka tallentaa v\u00e4limuistiin raskaat toiminnot (kuten tietokantakyselyt) PHP:ss\u00e4?<\/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":[750,719,895,834,843,803,1088,864],"tags":[1166],"class_list":["post-233048","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-avoin-laehdekoodi","category-kehittaejae","category-koodi","category-opas-aloittelijoille","category-opetusohjelmia","category-php-5","category-sivuston-nopeus","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=233048"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233048\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/220836"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=233048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=233048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=233048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}