<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блог на студио Свест &#187; Без категория</title>
	<atom:link href="http://blog.svest.org/category/%d0%b1%d0%b5%d0%b7-%d0%ba%d0%b0%d1%82%d0%b5%d0%b3%d0%be%d1%80%d0%b8%d1%8f/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.svest.org</link>
	<description>Блог за полезни съвети техники за интернет програмиране и уеб дизайн и разработка, фирмен PR.</description>
	<lastBuildDate>Mon, 06 Oct 2008 07:09:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Кеширане с файлове в PHP</title>
		<link>http://blog.svest.org/%d0%ba%d0%b5%d1%88%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d1%81-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2%d0%b5-%d0%b2-php/</link>
		<comments>http://blog.svest.org/%d0%ba%d0%b5%d1%88%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d1%81-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2%d0%b5-%d0%b2-php/#comments</comments>
		<pubDate>Thu, 24 Apr 2008 13:21:14 +0000</pubDate>
		<dc:creator>Стоян Кьосев</dc:creator>
				<category><![CDATA[Без категория]]></category>

		<guid isPermaLink="false">http://blog.svest.org/?p=10</guid>
		<description><![CDATA[Кеширането е често срещана тема, що се отнася до уеб програмирането. Интересно е, че аз лично съм попадал често на хора, занимаващи се от доста време с php, за които тази тема е мъглива, затова ще се опитам да хвърля малко светлина по въпроса. 
Общо взето страниците представят видимо статична дата, която обаче е с [...]]]></description>
			<content:encoded><![CDATA[<p>Кеширането е често срещана тема, що се отнася до уеб програмирането. Интересно е, че аз лично съм попадал често на хора, занимаващи се от доста време с php, за които тази тема е мъглива, затова ще се опитам да хвърля малко светлина по въпроса. </p>
<p>Общо взето страниците представят видимо статична дата, която обаче е с динамичен контекст. Например &#8211; страницата за обява в сайт за недвижими имоти. Отделните елементи на обявата (град, описание и т.н.) се вземат от базата данни, което става при всеки request (при всяко отваряне на страницата). Като информация обявата се променя сравнително рядко, т.е. заявката към базата данни и обработката на върнатия резултат си остават същите. Голяма част от времето за изпълнение на скрипта се поглъща именно от заявки за бази данни. Тук е най-подходящо да се приложи кеширане на ниво файл, което следва следните стъпки:</p>
<ul>
<li>- Проверка дали резултата с данните не е вече в кеша.</li>
<li>- Ако е и валидността не е изтекла (изминал е 1 час от записа) &#8211; ползваме него</li>
<li>- Ако не е или валидността е изтекла- изтегляме го от базата данни, обработваме го и го записваме в кеша за 1 час (примерно)</li>
</ul>
<p>Това означава, че в рамките на 1 час след записа, няма да има никакви обръщения към базата данни, а ще се ползва директно готовия резултат. </p>
<p>Из нета <a href="http://www.google.bg/search?q=php+caching">съществуват доста решения</a> за кеширане, като се започне от <a href="http://framework.zend.com/manual/en/zend.cache.html">решения за цялостно кеширане</a>, който не се ограничават само до файловата система и се стигне до <a href="http://pear.php.net/package/Cache_Lite">един от най-популярните пакети за файлово кеширане</a>. Аз лично съм ползвал доста често PEAR::Cache_Lite, докато един от проектите ми не почна да бави значително, а причината се оказа именно Cache_Lite. Най-вероятно съществува начин да се коригира, а и грешката може да е била в моя код или в настройките за класа. Отдавна обаче се канех да си създам кеширащ клас. Първо защото настоящите решения са прекалено тежки, тъй като се опитват да бъдат all-in-one, второ защото кешът не е голяма философия и не ми отне много време да си направя <a href="http://incubator.svest.org/tiny-cache/TinyCache.phps">собствен клас</a>.</p>
<p>Пример А:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'TinyCache.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> dbGetComplexMultiJoinQuery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
            <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'item - '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">21</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            <span style="color: #cc66cc;">1</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'item - '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">21</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'path'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ttl'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$varcache</span> <span style="color: #339933;">=</span> TinyCache<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'var'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$varcache</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getVar</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> dbGetComplexMultiJoinQuery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$varcache</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">putVar</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Масивът <strong>$options</strong> приема следните ключове:</p>
<div class="options_info">
<dl>
<dt><strong>&#8216;path&#8217; | @string | default: &#8216;/tmp/&#8217; </strong></dt>
<dd>пълен път до директорията, където ще се съхранява кеш файловете</dd>
<dt><strong>&#8216;ttl&#8217; | @integer | default: 3600</strong></dt>
<dd>време в секунди, за което ще се прази кеша преди да се обнови</dd>
<dt><strong>&#8216;prefix&#8217; | @string | default: &#8216;cache_&#8217;</strong></dt>
<dd>представката на файловете с кеша</dd>
<dt><strong>&#8216;auto_serialize&#8217; | @boolead | default: true</strong></dt>
<dd>(важи само за varCache) &#8211; флаг дали автоматично да сериализира/десериализира записваната променлива (default: true)</dd>
</dl>
</div>
<p>Пример Б:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'TinyCache.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'path'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ttl'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$flowcache</span> <span style="color: #339933;">=</span> TinyCache<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'flow'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$flowcache</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">start</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'b'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$row_num</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$result</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">10</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'The result from mega complex calculations is '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$result</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$row_num</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Row data: '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$i</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> 
    <span style="color: #000088;">$flowcache</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Да обощя &#8211; кешът е подходят за облекчаване на системата от ресурсоемък процес, генериращ данни, които не се сменят често, като най-честото му приложение е записването на резултат от заявка към база данни (VarCache) или записването на генериран html за дадена страница (FlowCache).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.svest.org/%d0%ba%d0%b5%d1%88%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d1%81-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2%d0%b5-%d0%b2-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

