{"id":233050,"date":"2023-02-03T16:37:00","date_gmt":"2023-02-03T13:37:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233050"},"modified":"2022-11-10T18:55:24","modified_gmt":"2022-11-10T15:55:24","slug":"jak-buforowac-ciezkie-operacje-takie-jak-zapytania-do-bazy-danych-w-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/jak-buforowac-ciezkie-operacje-takie-jak-zapytania-do-bazy-danych-w-php\/","title":{"rendered":"Jak buforowa\u0107 ci\u0119\u017ckie operacje (takie jak zapytania do bazy danych) w PHP?"},"content":{"rendered":"\n<p>PHP to bardzo popularny j\u0119zyk programowania w sieci. Jest to wygodny i pot\u0119\u017cny, lu\u017ano pisany j\u0119zyk programowania, kt\u00f3ry mo\u017cesz nauczy\u0107 si\u0119 i u\u017cywa\u0107 w kr\u00f3tkim czasie. Staje si\u0119 tak szeroko rozpowszechniony i popularny, by\u0107 mo\u017ce dzi\u0119ki WordPressowi, blogowaniu lub CMS (systemowi zarz\u0105dzania tre\u015bci\u0105). Wiele stron internetowych, takich jak Facebook, jest pierwotnie opartych na PHP.<\/p>\n<p>Jednak PHP jest og\u00f3lnie uwa\u017cany za wolno interpretuj\u0105cy j\u0119zyk skryptowy, chocia\u017c istnieje wiele technik przyspieszaj\u0105cych go, np. domy\u015blnie instalowany Zend Optimiser. HHVM pomaga <a href=\"https:\/\/hhvm.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">skompilowa\u0107<\/a> PHP w czasie wykonywania do czego\u015b takiego jak kod bajtowy, kt\u00f3ry mo\u017cna nast\u0119pnie przet\u0142umaczy\u0107 na kod natywny, co poprawia wydajno\u015b\u0107.<\/p>\n<p>Zapytania do bazy danych s\u0105 czasoch\u0142onne, zw\u0142aszcza w przypadku du\u017cych tabel lub tabel bez odpowiedniego indeksowania. Czasami takie operacje spowalniaj\u0105 \u0142adowanie\/przetwarzanie strony, a nast\u0119pnie pogarszaj\u0105 wra\u017cenia u\u017cytkownika. Do\u015b\u0107 cz\u0119sto takie zapytania wymagaj\u0105 czasu, ale wyniki nie b\u0119d\u0105 si\u0119 zmienia\u0107 tak cz\u0119sto, np. mog\u0105 by\u0107 zmieniane raz dziennie. W takim przypadku lepiej jest buforowa\u0107 te wyniki w plikach i pobiera\u0107 je z odczytywania plik\u00f3w nast\u0119pnym razem, je\u015bli zostan\u0105 znalezione w pami\u0119ci podr\u0119cznej.<\/p>\n<p>Baza danych MySQL jest dobra w obs\u0142udze zapyta\u0144 z odpowiednim indeksowaniem. Jednak gdy st\u00f3\u0142 staje si\u0119 du\u017cy, wp\u0142ywa to w pewnym stopniu na wydajno\u015b\u0107. Mo\u017cemy buforowa\u0107 wszelkie operacje wymagaj\u0105ce du\u017cej mocy obliczeniowej i przechowywa\u0107 je w plikach na dyskach, aby nast\u0119pnym razem pobra\u0107 je bezpo\u015brednio z plik\u00f3w, co b\u0119dzie znacznie szybsze.<\/p>\n<p>Udost\u0119pnili\u015bmy klas\u0119 PHP, kt\u00f3r\u0105 mo\u017cna \u0142atwo wykorzysta\u0107 do w\u0142\u0105czenia do aplikacji.<\/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>Tak wi\u0119c komentarze s\u0105 na miejscu. Powy\u017csza klasa jest prosta i \u0142atwa w u\u017cyciu. Na przyk\u0142ad u\u017cy\u0142em nast\u0119puj\u0105cego do buforowania jednego zapytania dla mojej witryny.<\/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>Je\u015bli wi\u0119c chcemy wyczy\u015bci\u0107 pami\u0119\u0107 podr\u0119czn\u0105, mo\u017cemy po prostu j\u0105 usun\u0105\u0107:<\/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>Narz\u0119dzie <a href=\"https:\/\/helloacm.com\/curl\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u017c\u0105dania nag\u0142\u00f3wka CURL online<\/a> wykorzystuje t\u0119 technik\u0119 pami\u0119ci podr\u0119cznej, aby zmniejszy\u0107 obci\u0105\u017cenie procesora serwera WWW, a te pliki pami\u0119ci podr\u0119cznej b\u0119d\u0105 czyszczone co kilka dni, aby zapobiec przeci\u0105\u017ceniu miejsca na dysku na serwerze WWW.<\/p>\n<p>Pami\u0119taj, \u017ce szybko\u015b\u0107 \u0142adowania strony jest jednym z czynnik\u00f3w wp\u0142ywaj\u0105cych na Tw\u00f3j wynik SEO. Wyszukiwarki preferuj\u0105 szybsze strony internetowe.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/helloacm.com\" class=\"external external_icon\">helloacm.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jak buforowa\u0107 ci\u0119\u017ckie operacje (takie jak zapytania do bazy danych) w 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":[721,897,752,805,836,845,1090,866],"tags":[1169],"class_list":["post-233050","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-otwarte-zrodlo","category-php-7","category-przewodnik-dla-poczatkujacych","category-samouczki","category-szybkosc-witryny","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233050","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=233050"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233050\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/220836"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233050"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233050"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233050"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}