<?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>SEO блог и уеб програмиране &#187; PHP</title>
	<atom:link href="http://ganbox.com/blog/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://ganbox.com/blog</link>
	<description>SEO практика: трикове при оптимизация и решаване на проблеми при уеб програмиране.</description>
	<lastBuildDate>Sun, 20 May 2012 19:28:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>PHP създаване на RSS Feed Generator</title>
		<link>http://ganbox.com/blog/rss-feed-generator/</link>
		<comments>http://ganbox.com/blog/rss-feed-generator/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 10:23:13 +0000</pubDate>
		<dc:creator>Георги Стефанов</dc:creator>
				<category><![CDATA[Валиден HTML код]]></category>
		<category><![CDATA[Софтуер]]></category>
		<category><![CDATA[Уеб програмиране]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS генератор]]></category>
		<category><![CDATA[RSS емесия]]></category>
		<category><![CDATA[създаване на RSS]]></category>

		<guid isPermaLink="false">http://ganbox.com/blog/?p=1573</guid>
		<description><![CDATA[Ganbox.com предоставя безплатно един PHP клас за бързо създаване на динамична RSS емисия с новини, които се извличат от базата данни на твой сайт. Целта при написването на този клас е: 1. Да се използва лесно и удобно с кратък запис. Има включен пример в кода. 2. Да се валидира XML кода на RSS-а от [...]]]></description>
			<content:encoded><![CDATA[<p>Ganbox.com предоставя безплатно един PHP клас за бързо създаване на динамична RSS емисия с новини, които се извличат от базата данни на твой сайт.</p>
<p>Целта при написването на този клас е:</p>
<p>1. Да се използва лесно и удобно с кратък запис. Има включен пример в кода.<br />
2. Да се валидира XML кода на RSS-а от валидатора <a href="http://feedvalidator.org/">http://feedvalidator.org</a><br />
3. Да няма проблем с кирилицата, включително URL адреси на кирилица.<br />
4. Да работи и на по-старата PHP версия 4, за да може да се ползва на по-стари сайтове.</p>
<p>Софтуерът се предлага безплатно под лиценза Creative Commons 3.0 &#8211; <a href="http://creativecommons.org/licenses/by/3.0/deed.bg">http://creativecommons.org/licenses/by/3.0/deed.bg</a></p>
<h2>Създаване на RSS емисия с PHP</h2>
<p>За този пример ще предположим, че на твоя сайт sait.com имаш новини, които стоят в база данни в таблица с име news. Таблицата има следните полета: id &#8211; номер на новина; title &#8211; заглавие на новина; body &#8211; текст на новината; date &#8211; дата на създаване. Предполага се още, че URL адресите на всяка новина имат следния вид: http://sait.com/news.php?id=2 и вече има направена връзка към базата данни във файл db.php.</p>
<p>Изтегли файла <a href="http://ganbox.com/blog/wp-content/pub/class.rss_feed.php_.zip">Ganbox.com RSS Feed Generator</a> и го разархивирай. Ще получиш файла class.rss_feed.php. Може да го поставиш в главната уеб директория на сайта. Там създай файла feed.php, който ще генерира твоя RSS и ще има следното съдържание:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;class.rss_feed.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// включва класа за RSS</span><br />
<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;db.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// връзка с базата данни</span><br />
<br />
<span style="color: #000088;">$feed</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RSSFeed<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// създава обект</span><br />
<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">init</span><span style="color: #009900;">&#40;</span><br />
&nbsp; <span style="color: #0000ff;">'RSS на sait.com'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// Заглавие на RSS емисия</span><br />
&nbsp; <span style="color: #0000ff;">'http://sait.com/feed.php'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// URL адрес на RSS емисия</span><br />
&nbsp; <span style="color: #0000ff;">'RSS с новините на сайт sait.com'</span> <span style="color: #666666; font-style: italic;">// Описание на емисията</span><br />
&nbsp; <span style="color: #339933;">,</span><span style="color: #0000ff;">'utf-8'</span> <span style="color: #666666; font-style: italic;">// Енкодинг на емисията (по подразбиране е utf-8 и може да се изтрие този ред)</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$news</span><span style="color: #339933;">=</span>get_last_news<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// връща последните 10 новини</span><br />
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$news</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$one</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #666666; font-style: italic;">//Добавяне на една публикация</span><br />
&nbsp; <span style="color: #000088;">$item</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Item<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemTitle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$one</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$one_url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://sait.com/news.php?id='</span><span style="color: #339933;">.</span><span style="color: #000088;">$one</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// URL адрес на новината</span><br />
&nbsp; <span style="color: #000088;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemLink</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$one_url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// URL адрес на публикация</span><br />
&nbsp; <span style="color: #000088;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemDate</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$one</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'date'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// дата на публикация, формат YYYY-MM-DD HH:MM:SS</span><br />
&nbsp; <span style="color: #000088;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemDesc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$one</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'body'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$item</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createFeed</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// създава и отпечатва целия XML на RSS-а</span><br />
<br />
<br />
<span style="color: #666666; font-style: italic;">// Примерна функция за извличане на последните count новини</span><br />
<span style="color: #000000; font-weight: bold;">function</span> get_last_news<span style="color: #009900;">&#40;</span><span style="color: #000088;">$count</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000088;">$ret</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT * FROM news ORDER BY id DESC LIMIT <span style="color: #006699; font-weight: bold;">$count</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/mysql_query"><span style="color: #990000;">mysql_query</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$num_rows</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/mysql_num_rows"><span style="color: #990000;">mysql_num_rows</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$num_rows</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/mysql_fetch_assoc"><span style="color: #990000;">mysql_fetch_assoc</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000088;">$ret</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$row</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Ако новините в базата данни не са в енкодинг utf-8 и има проблем с кирилицата опитай следното:<br />
1. Промени четвъртия параметър на функция init() от &#8216;utf-8&#8242;  на &#8216;cp1251&#8242;.<br />
2. Увери се, че файла feed.php има енкодинг cp1251.</p>
<p>За добавяне на лого към RSS емисията, след извикването на init() преди реда с get_last_news() постави:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$rss_title</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'RSS на sait.com'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// трябва да съвпада със заглавието на RSS-а</span><br />
<span style="color: #000088;">$rss_url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://sait.com/feed.php'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// трябва да съвпада с URL адреса на RSS-а</span><br />
<span style="color: #000088;">$img_url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://sait.com/logo.png'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// URL адрес на логото (приема само JPG, GIF и PNG)</span><br />
<span style="color: #000088;">$img_width</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #666666; font-style: italic;">// ширина на логото в пиксели</span><br />
<span style="color: #000088;">$img_height</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// височина на логото</span><br />
<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFeedImage</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rss_title</span><span style="color: #339933;">,</span> <span style="color: #000088;">$img_url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$rss_url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$img_width</span><span style="color: #339933;">,</span> <span style="color: #000088;">$img_height</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Също така, когато това е необходимо, класа прави много лесно добавянето на прикачен файл към публикация с таг enclosure, като сам пресмята размера на файла и определя типа на файла.</p>
<p>Разбира се освен за новини кода може да се ползва и за създаване на емисия с последните продукти на електронен магазин, който да даде възможност на потребителите да се абонират. </p>
<p>След като създадеш своите RSS канали, е добра идея да се прекарат през Google Feedburner и след това да се постави линк в началната страница на сайта към тях. Ако имаш нужда от помощ със създаването на твоите RSS емисии, както и по-нататъшното им ползване за <a href="http://ganbox.com">SEO</a> цели, <a href="http://ganbox.com/about">може да се свържеш с нас</a>.</p>
<p>Кодът е изпробван под PHP версии 4 и 5. Също така има работещо копие на класа на силно посещаван сайт.<br />
За всякакви коментари по кода пиши в тази тема.</p>
<div style="float:right;display:block" class="counterViews">Брой разглеждания на тази статия: <b>508</b></div>

<p>Подобни статии:<ol><li><a href='http://ganbox.com/blog/php-%d0%bf%d0%b0%d1%80%d1%81%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-xml-%d0%bd%d0%be%d0%b2%d0%b8%d0%bd%d0%b8-%d0%b7%d0%b0-%d1%82%d0%b2%d0%be%d1%8f-%d1%81%d0%b0%d0%b9%d1%82/' rel='bookmark' title='Permanent Link: PHP парсване на XML новини за твоя сайт'>PHP парсване на XML новини за твоя сайт</a> <small>Ще ти покажа малко PHP код, с който много лесно...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://ganbox.com/blog/rss-feed-generator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Оптимизиране на SQL заявки</title>
		<link>http://ganbox.com/blog/%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-sql-%d0%b7%d0%b0%d1%8f%d0%b2%d0%ba%d0%b8/</link>
		<comments>http://ganbox.com/blog/%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-sql-%d0%b7%d0%b0%d1%8f%d0%b2%d0%ba%d0%b8/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 09:48:41 +0000</pubDate>
		<dc:creator>Георги Стефанов</dc:creator>
				<category><![CDATA[Оптимизация на сайт]]></category>
		<category><![CDATA[Уеб програмиране]]></category>
		<category><![CDATA[mySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL заявки]]></category>
		<category><![CDATA[бавни SQL заявки]]></category>
		<category><![CDATA[бързодействие]]></category>
		<category><![CDATA[оптимизация]]></category>
		<category><![CDATA[оптимизация на SQL]]></category>
		<category><![CDATA[оптимизиране]]></category>
		<category><![CDATA[оптимизиране на SQL]]></category>
		<category><![CDATA[урок]]></category>

		<guid isPermaLink="false">http://ganbox.com/blog/?p=848</guid>
		<description><![CDATA[Основни положения при оптимизация на mySQL Обикновено проблемите с бавни SQL заявки се дължат на грешно проектирана база данни, липса или грешно използване на индекси и най-често неправилно написани SQL заявки. Статията разглежда няколко примера от практиката, които дават идеи за нов начин на писане на оптимизирани SQL заявки, при който не се прехвърлят много [...]]]></description>
			<content:encoded><![CDATA[<h2>Основни положения при оптимизация на mySQL</h2>
<p>Обикновено проблемите с <strong>бавни SQL заявки</strong> се дължат на грешно проектирана база данни, липса или грешно използване на индекси и най-често неправилно написани SQL заявки.</p>
<p>Статията разглежда няколко примера от практиката, които дават идеи за нов начин на писане на <strong>оптимизирани SQL заявки</strong>, при който не се прехвърлят много данни, за да се увеличи бързодействието.</p>
<h3>Мониторинг на SQL заявки</h3>
<p>На първо място препоръчвам на всеки използващ mySQL да ползва лог на бавните заявки. Активира се лесно и записва всяка заявка, която отнеме за изпълнението си повече от предварително зададено време (обикновено 10 сек.). Все пак не може да решиш проблем, ако не знаеш, че съществува <img src='http://ganbox.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Използвай EXPLAIN пред SELECT за информация относно заявката &#8211; кой индекс се използва, колко реда се преглеждат и др.<br />
За мониторинг в реално време препоръчвам mytop &#8211; приложение написано на Perl, което показва всички активни заявки и колко време отнемат.</p>
<h3>Няколко бързи съвета за начинаещи</h3>
<p>1. Ползвай колона id с атрибути PRIMARY и auto_increment за всяка таблица, дори да ти се струва, че никога няма да ти трябва.<br />
2. Избягвай винаги &#8222;SELECT * FROM &#8230;&#8220; вместо това пиши &#8222;SELECT col1, col2, col3&#8230; FROM &#8230;&#8220; &#8211; изброявай нужните колони вместо да вземаш всички данни.<br />
3. Никога не ползвай &#8222;SELECT (*) FROM &#8230;&#8220;, а пиши &#8222;SELECT (id) FROM &#8230;&#8220;, където id е колона с уникални стойности.<br />
4. При създаването на таблицата създай индекси по всяка една колона, по която в бъдеще се очаква да сортираш данните или да извличаш данни като търсиш по стойност в тази колона.<br />
5. Почти винаги т.4 е недостатъчна &#8211; трудно е да създадеш всички необходими индекси предварително. При написването на всяка нова заявка проверявай какви са колоните, по които се търси и провери дали има индекси по тях &#8211; ако няма ги създай веднага!<br />
6. Ползвай сложни индекси. Ако имаш заявка, в която се търси по повече от една колона например съдържа &#8222;&#8230; WHERE user_id = 8 AND date &gt; &#8217;2010-01-01&#8242; &#8222;, в този случай ако имаш отделни индекси по user_id и по date ще бъде автоматично избран и ползван само единия. Ако много често се изпълнява такава заявка (или си я открил в лога с бавни заявки) ти трябва сложен индекс по двете колони. Очаквай отделна статия по въпроса за комбинираните индекси.<br />
7. Нормализиране на таблици. Тук няма да влизам в детайли, а само ще спомена, че ако в някоя колона имаш данни, които изглеждат като: &#8222;4,5,13,45,345&#8243; &#8211; няколко стойности разделени със запетая, това почти винаги е знак за грешно проектирана база данни.<br />
8. Когато свързваш две таблици трябва типа на колоните, по които се свързва да съвпада точно, например ако едната е от тип INT(8), а другата е от тип INT(11) може да се очакват проблеми.</p>
<h3>Аксиома на gan за оптимизация на SQL</h3>
<p>Стреми се да пишеш SQL заявките си така, все едно уеб сървъра и SQL сървъра са на различни машини &#8211; пренесените данни между двата трябва да са минимални!</p>
<h2>Откриване на позицията на ред след сортиране на таблица</h2>
<p>Нека да предположим, че имаме сайт за игра и има таблица за класиране UserTop с колони username и points, в която за всеки потребител се записва, колко точки е спечелил общо от всички игри. Колоната username съдържа уникални стойности. Пример за SQL таблица UserTop:</p>
<table>
<tbody>
<tr>
<th>username</th>
<th>points</th>
</tr>
<tr>
<td>someuser</td>
<td>150</td>
</tr>
<tr>
<td>otheruser</td>
<td>50</td>
</tr>
<tr>
<td>ganbox</td>
<td>250</td>
</tr>
<tr>
<td>randomuser</td>
<td>350</td>
</tr>
<tr>
<td>vox</td>
<td>250</td>
</tr>
</tbody>
</table>
<p>След приключване на всяка игра по потребителско име се намира реда за играча и точките му се увеличават с тези от последната игра. Нека да кажем, че в момента е логнат потребител ganbox и искаме да покажем на играча на коя позиция е в класацията. Затова трябва да сортираме таблицата по колона points в намаляващ ред и да видим на коя позиция се намира ganbox. Един начинаещ програмист ще направи следното:</p>
<p><span style="color: #800000;">Грешно решение:</span></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT * FROM UserTop ORDER BY points DESC &quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">GetAll</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># всички резултати в масив (ползва се ADODB библиотека за краткост)<br />
</span><span style="color: #000088;">$pos</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br />
<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;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><br />
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'ganbox'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$pos</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Тук има няколко грешки:<br />
1. Взема се цялото съдържание на таблица UserTop &#8211; може да бъде огромно количество данни.<br />
2. На всяка итерация на цикъла for се оценява големината на масива $results.<br />
3. След като е намерена и записана позицията в pos, цикъла не се прекъсва, а продължава да се върти безсмислено.<br />
Не можете да си представите, колко много хора пишат по този небрежен начин. Затова много сайтове за игри работят отчайващо бавно при използване от много хора.</p>
<p>Следва малко по-добро, но все още неправилно решение.<br />
<span style="color: #800000;">Друго грешно решение:</span></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT username FROM UserTop ORDER BY points DESC &quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">GetAll</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># всички резултати в масив<br />
</span><span style="color: #000088;">$pos</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$size</span><span style="color: #339933;">=</span><a href="http://www.php.net/count"><span style="color: #990000;">count</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$results</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<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;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #000088;">$size</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><br />
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'ganbox'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$pos</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Подобренията се виждат:<br />
1. Избират се само данните от колона username &#8211; все още връща всички редове и данните са прекалено много.<br />
2. Оценката на големината на масива е изнесена извън цикъла.<br />
3. След откриване на позицията цикъла спира.<br />
По точки 2. и 3. сме ОК, но т. 1 е голям проблем. Представи си, че уеб сървъра и SQL сървъра са на отделни машини &#8211; всички данни от колона username трябва да минат по мрежата, ако таблицата съдържа много редове и се ползва от много хора, това ще доведе до значително забавяне. Така стигаме до идеята, че тази задача трябва да се <strong>оптимизира</strong>, като обработката се изнесе към SQL сървъра.</p>
<p>Почти правилно решение:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT COUNT( username ) AS pos FROM UserTop WHERE points &gt;= (SELECT points FROM UserTop WHERE username='ganbox' ) &quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$pos</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">GetOne</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># един резултат</span></div></div>
<p>Първо се изпълнява заявката в скобите, която връща точките на текущия играч (низа &#8216;ganbox&#8217; трябва да се замести с потребителското име на логнатия играч). След това се вземат всички редове, които имат повече точки (включително тези които имат равен брой точки с играча) и се преброяват. Връща се едно единствено число &#8211; прекрасно!<br />
Има един малък проблем. Ако има играчи с брой точки равен на броя точки на текущия адрес, позицията няма да е вярна. Затова:</p>
<p><span style="color: #008000;">Правилно решение:</span></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT COUNT( username ) AS pos FROM UserTop WHERE points &gt; (SELECT points FROM UserTop WHERE username='ganbox' ) &quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$pos</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">GetOne</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># един резултат<br />
</span><span style="color: #000088;">$pos</span><span style="color: #339933;">++;</span> <span style="color: #666666; font-style: italic;"># това е търсената позиция</span></div></div>
<p>Знакът е &gt; защото в класация сортираме от по-голямо към по-малко.</p>
<p>.</p>
<p>Ако ти е станало интересно продължавай да четеш, ще усложним задачите с примери от практиката.<br />
Нека освен таблица UserTop, която е класация имаме UserLog, в която в края на всяка игра се прави запис, като се записва време на приключване на играта и кой потребител колко точки е спечелил през последната игра:</p>
<table>
<tbody>
<tr>
<th>timestamp</th>
<th>username</th>
<th>poits</th>
</tr>
<tr>
<td>2010-01-10 11:12:23</td>
<td>someuser</td>
<td>100</td>
</tr>
<tr>
<td>2010-01-11 10:24:33</td>
<td>otheruser</td>
<td>20</td>
</tr>
<tr>
<td>2010-01-12 15:14:13</td>
<td>ganbox</td>
<td>60</td>
</tr>
<tr>
<td>2010-01-15 19:15:55</td>
<td>randomuser</td>
<td>90</td>
</tr>
<tr>
<td>2010-02-15 11:52:54</td>
<td>vox</td>
<td>80</td>
</tr>
<tr>
<td>2010-04-08 22:04:44</td>
<td>someuser</td>
<td>50</td>
</tr>
<tr>
<td>2010-04-08 22:05:07</td>
<td>otheruser</td>
<td>30</td>
</tr>
<tr>
<td>2010-04-08 22:05:34</td>
<td>ganbox</td>
<td>190</td>
</tr>
<tr>
<td>2010-04-08 22:06:17</td>
<td>randomuser</td>
<td>260</td>
</tr>
<tr>
<td>2010-04-08 22:06:51</td>
<td>vox</td>
<td>140</td>
</tr>
<tr>
<td>2010-04-08 22:07:58</td>
<td>vox</td>
<td>30</td>
</tr>
</tbody>
</table>
<p>Задачата е да подредим потребителите в класацията UserTop така, че ако няколко души имат равен брой точки по-напред да излиза този, който е играл по-скоро. В примера vox и ganbox имат еднакъв брой 250 точки, но vox трябва да излиза по-напред, защото е играл последен.</p>
<h3>Сортиране на данни по два критерия в различни таблици</h3>
<p>Заявката, която ще изведе играчите сортирани първо по брой точки, а тези с еднакъв брой по времето на последната активност:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT T.username, T.points FROM UserTop T LEFT JOIN UserLog L USING(username) GROUP BY username ORDER BY T.points DESC , L.timestamp DESC&quot;</span><span style="color: #339933;">;</span></div></div>
<p>Дотук добре. Сега освен страницата с тази класация искаме да показваме последните 10 действия &#8211; последните 10 играчи, които са играли. Там разбира се може да има повторения. Заявката е елементарна, но ни подготвя за следващата задача.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT username, points FROM `UserLog` ORDER BY `UserLog`.`timestamp` &nbsp;DESC LIMIT 10&quot;</span><span style="color: #339933;">;</span></div></div>
<p>Забеляза ли, че не ползвам &#8222;SELECT * FROM&#8220;, а избирам тези които ми трябват (не го забравяй!).</p>
<p>Добре стигнахме до интересното. Следват два примера от практиката.</p>
<h4>Откриване на класирането на играч в края на игра</h4>
<p>Искаме в края на всяка игра освен да добавим запис в UserLog и да увеличим точките на играча в UserTop, да намерим новата позиция на играча в класацията и общия брой на точките му, за да може да му съобщим тези данни.</p>
<p><span style="color: #008000;">Правилно решение:</span></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot; SET @num:=0; SELECT username, pos, points FROM (SELECT @num := @num + 1 AS pos, T.points, T.username FROM UserTop T LEFT JOIN UserLog L USING(username) GROUP BY T.username ORDER BY T.points DESC, L.timestamp DESC) as R WHERE username = 'ganbox' &quot;</span><span style="color: #339933;">;</span></div></div>
<p>Вижда се, че ganbox е на 3-то място с 250 точки, а vox на второ пак с 250, но е играл по-скоро.<br />
Заявката отново е <strong>супер оптимизирана</strong> <em>според аксиомата на gan</em> <img src='http://ganbox.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  така, че да върне само нужните данни.<br />
Използва вътрешна SQL променлива @num, която първоначално се нулира. След това се изпълнява вътрешната заявка, която написана отделно:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot; SET @num := 0; SELECT @num := @num + 1 AS pos, T.points, T.username FROM UserTop T LEFT JOIN UserLog L USING(username) GROUP BY T.username ORDER BY T.points DESC, L.timestamp DESC&quot;</span> <span style="color: #339933;">;</span></div></div>
<p>ще върне всички играчи в класацията с добавена колона с име pos, в която е позицията на всеки играч. По този начин външната заявка има задачата само да филтрира данните за играча, който ни интересува.</p>
<h4>Откриване на запис отпаднал от последните 10 действия</h4>
<p>Искаме още в края на всяка игра, да намерим кой играч е отпаднал на 11-място в лога (т.е. името му не се вижда вече в последните 10) и само ако името му го няма в първите 10 резултата да предприемем действие &#8211; например да го поканим да играе отново.</p>
<p>Как да решим тази задача? Можем лесно да вземем играча на позиция 11, както и да изведем всички от първите 10 позиции, но как да проверим дали този от 11-та се съдържа в първите 10?<br />
Единия подход е с една заявка да вземем играча X от 11 позиция. След това с втора заявка да вземем потребителските имена на всички от първите 10, да ги заредим в PHP масив и да потърсим X в масива. Както вече се досети този подход не ми харесва, защото за 10 не е страшно, но ако са 100, а ако са 1000? Трябва ни отново <strong>оптимизирано решение</strong> с минимално прехвърляне на данни.</p>
<p><span style="color: #008000;">Правилно решение:</span></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SET @L:=(SELECT username FROM UserLog ORDER BY timestamp DESC LIMIT 10,1); SELECT @L AS username,SUM(F) AS cnt FROM (SELECT IF(username=@L,1,0) AS F FROM UserLog ORDER BY timestamp DESC LIMIT 0,10) AS T&quot;</span><span style="color: #339933;">;</span></div></div>
<p>Тази заявка ще върне резултат:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a><br />
<span style="color: #009900;">&#40;</span><br />
<span style="color: #009900;">&#91;</span>username<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'someuser'</span><span style="color: #339933;">,</span><br />
<span style="color: #009900;">&#91;</span>cnt<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> &nbsp; &nbsp;<span style="color: #cc66cc;">1</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Наистина ако сортираш UserLog от примера по време в обратен ред, someuser е на 11 позиция. Също така се среща на 6-та позиция и затова cnt е 1, като cnt показва не само дали се среща, но и колко пъти се среща в позициите от 1 до 10. По този начин предприемаш действие само ако cnt=0.</p>
<p>Това бяха само някои идеи за нов стил на писане на SQL заявки с цел <strong>оптимизиране на бързодействието</strong>. За пълнота ще спомена, че в много случаи отлични резултати могат да се постигнат при използване на <strong>кеширане на SQL заявки</strong>. Самото кеширане на заявки се програмира лесно. Трудното е да се определи в кой момент да се ползва кеш. Темата ще бъде разгледана в друга статия.</p>
<p>Всички SQL заявки са тествани и работят. Ще се радвам на коментари по темата.</p>
<div style="float:right;display:block" class="counterViews">Брой разглеждания на тази статия: <b>5257</b></div>

<p>Подобни статии:<ol><li><a href='http://ganbox.com/blog/%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%b1%d1%8a%d1%80%d0%b7%d0%be%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d0%b5%d1%82%d0%be/' rel='bookmark' title='Permanent Link: Оптимизиране на бързодействието на сайт'>Оптимизиране на бързодействието на сайт</a> <small>Пиша тази статия като продължение на статията PHP парсване на...</small></li>
<li><a href='http://ganbox.com/blog/%d0%b7%d0%b0%d1%80%d0%b5%d0%b6%d0%b4%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%b4%d0%b0%d0%bd%d0%bd%d0%b8-%d1%81-ajax-%d0%be%d1%82-%d0%be%d1%82%d0%b4%d0%b0%d0%bb%d0%b5%d1%87%d0%b5%d0%bd-%d1%81%d1%8a%d1%80/' rel='bookmark' title='Permanent Link: Зареждане на данни с Ajax от отдалечен сървър'>Зареждане на данни с Ajax от отдалечен сървър</a> <small>Задача за оптимизиране бързината на сайт Наскоро работих по сайта...</small></li>
<li><a href='http://ganbox.com/blog/seo-%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-oscommerce/' rel='bookmark' title='Permanent Link: SEO оптимизиране на osCommerce'>SEO оптимизиране на osCommerce</a> <small>Тази статия е за SEO оптимизиране на онлайн магазин от...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://ganbox.com/blog/%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-sql-%d0%b7%d0%b0%d1%8f%d0%b2%d0%ba%d0%b8/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Логване в сайт с OpenID през Google</title>
		<link>http://ganbox.com/blog/%d0%bb%d0%be%d0%b3%d0%b2%d0%b0%d0%bd%d0%b5-%d0%b2-%d1%81%d0%b0%d0%b9%d1%82-%d1%81-openid-%d0%bf%d1%80%d0%b5%d0%b7-google/</link>
		<comments>http://ganbox.com/blog/%d0%bb%d0%be%d0%b3%d0%b2%d0%b0%d0%bd%d0%b5-%d0%b2-%d1%81%d0%b0%d0%b9%d1%82-%d1%81-openid-%d0%bf%d1%80%d0%b5%d0%b7-google/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 13:08:17 +0000</pubDate>
		<dc:creator>Георги Стефанов</dc:creator>
				<category><![CDATA[Сигурност]]></category>
		<category><![CDATA[Уеб програмиране]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[доставчик на OpenID]]></category>
		<category><![CDATA[достъп до много сайтове]]></category>
		<category><![CDATA[една парола]]></category>
		<category><![CDATA[идентификация]]></category>
		<category><![CDATA[логване]]></category>
		<category><![CDATA[оторизиране]]></category>
		<category><![CDATA[сигурност]]></category>
		<category><![CDATA[удостоверяване]]></category>
		<category><![CDATA[урок]]></category>

		<guid isPermaLink="false">http://ganbox.com/blog/?p=710</guid>
		<description><![CDATA[Ограничен достъп и логване с OpenID Някой от страниците на сайта ganbox.com реших да са достъпни само след логване, затова ми се наложи да си направя логин форма, през която потребителите да се логват и да получават достъп. Обикновено една такава система включва в себе си няколко функции: страница за регистриране, страница за логване, страница [...]]]></description>
			<content:encoded><![CDATA[<h3>Ограничен достъп и логване с OpenID</h3>
<p>Някой от страниците на сайта <a href="http://ganbox.com">ganbox.com</a> реших да са достъпни само след логване, затова ми се наложи да си направя логин форма, през която потребителите да се логват и да получават достъп. Обикновено една такава система включва в себе си няколко функции: страница за регистриране, страница за логване, страница за забравена парола, страница за промяна на парола или други лични данни, управление на сесии, база данни с данни за потребителите. Мислих няколко варианта и накрая реших, че без последните две няма как да мина, но нямам време да правя другите страници. Затова избрах решение с OpenID логване.</p>
<h3>Какво е OpenID?</h3>
<p>Съвсем накратко: <strong>с една парола достъп до много сайтове</strong>. Това е метод, който обединява протокол и системи, който ти дава възможност да се регистрираш в един сайт и след това да получаваш достъп до много други сайтове, които поддържат OpenID, само като се логваш в първия сайт.</p>
<h3>Как работи OpenID</h3>
<p>Регистрираш се в един сайт, който е <strong>доставчик на OpenID</strong> и там получаваш данни за достъп до акаунта, които обикновено са комбинация от имейл и парола или потребителско име и парола. От този момент можеш да се логваш във всеки един сайт, който поддържа този доставчик на OpenID.</p>
<p>Някои от сайтовете, като например сайта за споделяне на връзки dao.bg (а и много други подобни сайтове), изискват първо да си създадеш профил в сайта и едва след това може да присъединиш OpenID идентификатор в профила си, за да може да се логваш с OpenID.</p>
<p>Трик за сигурност: След като въведеш OpenID е препоръчително да смениш паролата си в този сайт с някаква невъзможно сложна и дълга парола.Тъй като няма повече да ползваш тази парола, от съображения за <strong>сигурност</strong> е по-добре да не може да бъде налучкана от хакери.</p>
<h3>Предимства на OpenID</h3>
<h4>1. Без измисляне на нови пароли. </h4>
<p>Не е нужно да помниш много пароли, а само една и по-рядко ще ти се случва да забравиш паролата си.</p>
<h4>2. Бърза регистрация. </h4>
<p>В повечето сайтове, в които искаш да влезеш няма да ти се налага да се регистрираш или ако има такава стъпка доста от данните ще бъдат попълнени, защото се изпращат от сайта доставчик на OpenID.</p>
<h4>3. На уеб програмистите спестява време.</h4>
<p>Отпада нуждата от програмиране на няколко уеб страници.</p>
<h4>4. По-висока степен на сигурност.</h4>
<p>Виж по-долу в параграфа Сигурност.</p>
<h3>Недостатъци на OpenID</h3>
<p>Хора които са слабо запознати с интернет технологиите и с OpenID могат да се уплашат, че за вход в твоя сайт трябва да въведат паролата си за Гугъл. Това се случи в ganbox.com, затова в логин страницата поставих блок Информация.</p>
<h3>Сигурност</h3>
<p>Всъщност метода на логване през OpenID е с <strong>висока степен на сигурност</strong>, защото въвеждаш паролата си в страница на Гугъл защитена с SSL и това, което Google изпраща към сайта, в който се логваш се контролира от теб. В случая на ganbox.com това е единствено имейл адреса, като при първото изпращане ти получаваш предупреждение за това и се съгласяваш с това действие.</p>
<p>Трябва да гледаш с добро око на сайтовете, които предлагат OpenID логин. Повечето хора използват една и съща парола за няколко сайта. Ако и ти правиш така, то при използване на OpenID избягваш следния риск (макар и минимален).  При регистриране в нов сайт в момента на въвеждане на паролата е възможно някой от администраторите да получи тази парола в чист текст. След това той може да злоупотреби и ще има достъп до всичките сайтове, в които използваш тази парола. При OpenID нямаш този проблем, защото в новия сайт не се изпраща парола.</p>
<h3>Логване с OpenID в страница на PHP</h3>
<p>В ganbox.com за начало като OpenID доставчик избрах Google, защото почти всеки има поща в gmail.com или ползва друга услуга на Google и има Google акаунт. В последствие може да се добавят още доставчици, като например Facebook и човек ще може да си избира с кой от двата да се логне.</p>
<p>В този урок ще покажа как да си направиш логване в твоя сайт през акаунт на <strong>Гугъл</strong>.</p>
<p>1. Изтегли си библиотеката <a href="http://ganbox.com/blog/wp-content/pub/class.openid.php_.zip">class.openid.php</a>, разархивирай файла и го постави в директория inc, която трябва да е в главната уеб директория.</p>
<p>2. В главната уеб директория създай два файла login.php и return.php</p>
<p>Основния код в login.php, който стартира процес по логване е:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/inc/class.openid.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>user_logged<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; GoogleOpenId<span style="color: #339933;">::</span><span style="color: #004000;">login</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://ganbox.com&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;http://ganbox.com/return.php&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location: /'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><a href="http://www.php.net/exit"><span style="color: #990000;">exit</span></a><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Функция user_logged() проверява дали потребителя се е логнал.<br />
Последния параметър true на GoogleOpenId::login указва дали твоя сайт ще изиска имейл адрес.<br />
Този ред ще пренасочи браузъра към страница за логване в Google профил (ако вече не си логнат в Гугъл), след като се логнеш първият път ще ти се изведе съобщение, че сайта изисква имейл и трябва да се съгласиш да предоставиш тази информация, след което ще те редиректнат отново към http://ganbox.com/return.php</p>
<p>В return.php основния код е:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/inc/class.openid.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> GoogleOpenId<span style="color: #339933;">::</span><span style="color: #004000;">getResponse</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'id_res'</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> &nbsp; &nbsp;<span style="color: #666666; font-style: italic;"># успешно логване<br />
</span>&nbsp; &nbsp; <span style="color: #000088;">$email</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getEmail</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># имейл<br />
</span>&nbsp; &nbsp; user_login<span style="color: #009900;">&#40;</span><span style="color: #000088;">$email</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location:/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><a href="http://www.php.net/exit"><span style="color: #990000;">exit</span></a><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/die"><span style="color: #990000;">die</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Неуспешен вход'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>В този код функцията user_login() се грижи да създаде сесия и да отбележи, че потребителя е логнат. Ако до момента не е имало потребител с подадения имейл, автоматично го регистрира и логва.<br />
Това е всичко по оторизирането на потребителя &#8211; просто и бързо.</p>
<p>След това във всяка страница, в което искам да огранича достъпа викам функция  user_logged(), която проверява дали потребителя е логнат и ако не е логнат или ако сесията е изтекла се пренасочва към страница за логване.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>user_logged<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location: /login.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><a href="http://www.php.net/exit"><span style="color: #990000;">exit</span></a><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Работещ пример има в сайта ganbox.com, като с ограничен достъп са страниците <a href="/pos">Класиране на сайт</a>, <a href="/seo-status">SEO състояние на сайт</a> и <a href="/resize">Промяна на снимка</a>.<br />
Това е накратко. Ако има интерес и имам време мога да дам пълните кодове. Пишете коментари! <img src='http://ganbox.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div style="float:right;display:block" class="counterViews">Брой разглеждания на тази статия: <b>5209</b></div>

<p>Подобни статии:<ol><li><a href='http://ganbox.com/blog/%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%b1%d1%8a%d1%80%d0%b7%d0%be%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d0%b5%d1%82%d0%be/' rel='bookmark' title='Permanent Link: Оптимизиране на бързодействието на сайт'>Оптимизиране на бързодействието на сайт</a> <small>Пиша тази статия като продължение на статията PHP парсване на...</small></li>
<li><a href='http://ganbox.com/blog/%d1%81%d0%bf%d0%be%d0%b4%d0%b5%d0%bb%d1%8f%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%b4%d0%be%d1%81%d1%82%d1%8a%d0%bf-%d0%b4%d0%be-google-analytics-%d0%b8-google-adwords/' rel='bookmark' title='Permanent Link: Споделяне на достъп до Google Analytics и Google Adwords'>Споделяне на достъп до Google Analytics и Google Adwords</a> <small>Google Analytics Google Analytics е безплатен уеб инструмент на Гугъл...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://ganbox.com/blog/%d0%bb%d0%be%d0%b3%d0%b2%d0%b0%d0%bd%d0%b5-%d0%b2-%d1%81%d0%b0%d0%b9%d1%82-%d1%81-openid-%d0%bf%d1%80%d0%b5%d0%b7-google/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP strlen() и текстове на кирилица</title>
		<link>http://ganbox.com/blog/php-strlen-%d0%b8-%d1%82%d0%b5%d0%ba%d1%81%d1%82%d0%be%d0%b2%d0%b5-%d0%bd%d0%b0-%d0%ba%d0%b8%d1%80%d0%b8%d0%bb%d0%b8%d1%86%d0%b0/</link>
		<comments>http://ganbox.com/blog/php-strlen-%d0%b8-%d1%82%d0%b5%d0%ba%d1%81%d1%82%d0%be%d0%b2%d0%b5-%d0%bd%d0%b0-%d0%ba%d0%b8%d1%80%d0%b8%d0%bb%d0%b8%d1%86%d0%b0/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 18:27:14 +0000</pubDate>
		<dc:creator>Георги Стефанов</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Уеб програмиране]]></category>
		<category><![CDATA[mbstring]]></category>
		<category><![CDATA[mb_strlen]]></category>
		<category><![CDATA[mb_substr]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[strlen]]></category>
		<category><![CDATA[substr]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[съвет]]></category>
		<category><![CDATA[уеб форма]]></category>
		<category><![CDATA[урок]]></category>

		<guid isPermaLink="false">http://ganbox.com/blog/?p=676</guid>
		<description><![CDATA[Проблем Вече в няколко сайта уеб директории, забелязвам следния проблем: в уеб формата за качване на сайт полетата имат ограничение в броя на символите, което е нормално, но е проблем, когато пише, че може да въведеш 100 символа, а реално можеш да въведеш само 50. Още по-досадно и времеотнемащо е, ако софтуера създаващ уеб формата [...]]]></description>
			<content:encoded><![CDATA[<h3>Проблем</h3>
<p>Вече в няколко сайта уеб директории, забелязвам следния проблем: в уеб формата за качване на сайт полетата имат ограничение в броя на символите, което е нормално, но е проблем, когато пише, че може да въведеш 100 символа, а реално можеш да въведеш само 50. Още по-досадно и времеотнемащо е, ако софтуера създаващ уеб формата не се грижи да запомни всички въведени полета и при грешка в едно от полетата изтрива всички полета &#8211; за форми с много полета това е направо кошмар, защото трябва да въвеждаш всичко отначало.</p>
<p>Най-фрапиращ случай за това е сайта bestbgsites.com. Не е лесно да добавиш линк в този сайт. Гърми грешката: &#8222;Името на сайта е прекалено дълго! Може да бъде 85 символа&#8220; проблема е, че ако заглавието е на кирилица дължината е до 42 символа  Описанието пише, че може да бъде до 255 символа, но реално са 127.  Има и кратко описание до 30 символа (реално 15), което е трудно за измисляне. Ако сбъркаш някое от полетата всичките въведени данни се изтриват и трябва да се попълват повторно <img src='http://ganbox.com/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Същия проблем има и сайта bglogs.com, като тук формата запомня полетата, но пък има ограничение в броя на грешните опити, след което пак трябва да започнеш на чисто. Полетата Описание и META Description пише, че имат лимит 500 символа и дори има Javascript, който намалява брояча на символите при всяко натискане на клавиш, когато въвеждаш в полето. Проблемът идва, когато изпратиш данните към сървъра, той ги проверява и ти показва, че си превишил доста лимита. В полето Заглавие е още по-трудно, защото лимита е замислен да бъде 100 символа, но на кирилица са само 50.</p>
<h3>Обяснение</h3>
<p>Тези проблеми се получават, защото представянето на всеки символ на кирилица при UTF8 е в 2 байта. Сайтовете ползват готов безплатен софтуер писан от англо-говорящи, които са свикнали при проверка държина на низ да използват PHP функцията strlen(),  която работи на ниво байтове и затова тази функция преброява низ на кирилица с дължина 50 символа, като низ с дължина 100 символа.</p>
<h3>Решение</h3>
<p>Решението е много лесно, но трябва да бъде извършено от собственика на сайта. Трябва функцията strlen() да се замени с функцията mb_strlen(), която се съобразява с енкодинга и правилно преброява низ независимо на какъв език е написан. Тази функция се осигурява от библиотеката mbstring (Multibyte String), която за щастие отдавна се поддържа от всички български хостинг доставчици.</p>
<h3>Отрязване на низ на кирилица</h3>
<p>Подобен проблем се получава, ако отрязваш низ на кирилица в енкодинг UTF8 например показване на извадка от новина. Ако искаш да покажеш първите 200 символа от новина и направиш</p>
<p>$text = substr($text, 0, 200);</p>
<p>като резултат ще имаш първите 100 символа, като е възможно последния символ да бъде &#8222;срязан по средата&#8220;, в смисъл, че от двата байта, с които е представен ще остане само първия и в резултат на това в страницата ще бъде показан странен символ, който е невалиден UTF8 символ и чупи страницата. В резултат на това страницата няма да може да бъде валидирана, като XHTML документ. Нямам лични наблюдения как се отразява това на <a title="seo оптимизация на бизнес сайт" href="/seo" target="_blank">SEO</a>, но предполагам, че е проблем за ботовете на много от търсачките.</p>
<p>За да решиш този проблем трябва просто да замениш функцията substr() с функцията mb_substr(), като разбира се библиотеката mbstring трябва да е предварително инсталирана.</p>
<h3>Заключение</h3>
<p>Изрично искам да отбележа, че нямам нищо против споменатите два сайта и целта на статията ми не е да ги злепостави, а да помогне на тях и на всички, които имат сайт, който ползва готов софтуер, в който не е помислено, че ще се въвежда нещо различно от латински символи.</p>
<div style="float:right;display:block" class="counterViews">Брой разглеждания на тази статия: <b>3939</b></div>

<p>Подобни статии:<ol><li><a href='http://ganbox.com/blog/%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%b1%d1%8a%d1%80%d0%b7%d0%be%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d0%b5%d1%82%d0%be/' rel='bookmark' title='Permanent Link: Оптимизиране на бързодействието на сайт'>Оптимизиране на бързодействието на сайт</a> <small>Пиша тази статия като продължение на статията PHP парсване на...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://ganbox.com/blog/php-strlen-%d0%b8-%d1%82%d0%b5%d0%ba%d1%81%d1%82%d0%be%d0%b2%d0%b5-%d0%bd%d0%b0-%d0%ba%d0%b8%d1%80%d0%b8%d0%bb%d0%b8%d1%86%d0%b0/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Оптимизиране на бързодействието на сайт</title>
		<link>http://ganbox.com/blog/%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%b1%d1%8a%d1%80%d0%b7%d0%be%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d0%b5%d1%82%d0%be/</link>
		<comments>http://ganbox.com/blog/%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%b1%d1%8a%d1%80%d0%b7%d0%be%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d0%b5%d1%82%d0%be/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 10:17:24 +0000</pubDate>
		<dc:creator>gan</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Уеб програмиране]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[база данни]]></category>
		<category><![CDATA[бързодействие]]></category>
		<category><![CDATA[кеширане]]></category>
		<category><![CDATA[оптимизиране]]></category>
		<category><![CDATA[съвет]]></category>
		<category><![CDATA[урок]]></category>

		<guid isPermaLink="false">http://ganbox.com/blog/?p=384</guid>
		<description><![CDATA[Пиша тази статия като продължение на статията PHP парсване на XML новини за твоя сайт. Разглеждам оптимизиране на бързодействието на динамичен сайт, който зарежда информация от база данни. Сайтът ganbox.com е разделен на две части, които се различават и визуално. Основен сайт за SEO оптимизация и SEO блог. Реших в лявата колона на основния сайт [...]]]></description>
			<content:encoded><![CDATA[<p>Пиша тази статия като продължение на статията <a href="/blog/php-%d0%bf%d0%b0%d1%80%d1%81%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-xml-%d0%bd%d0%be%d0%b2%d0%b8%d0%bd%d0%b8-%d0%b7%d0%b0-%d1%82%d0%b2%d0%be%d1%8f-%d1%81%d0%b0%d0%b9%d1%82/">PHP парсване на XML новини за твоя сайт</a>. Разглеждам <strong>оптимизиране на бързодействието на динамичен сайт</strong>, който зарежда информация от база данни.</p>
<p>Сайтът ganbox.com е разделен на две части, които се различават и визуално. Основен сайт за <a href="http://ganbox.com">SEO оптимизация</a> и <a href="http://ganbox.com/blog">SEO блог</a>. Реших в лявата колона на основния сайт под менюто, да извеждам последните X на брой статии от блога.   Вече имах готов код за извличане на новини от RSS хранилка, но си поставих и две допълнителни условия: <strong>бързодействие и сигурност при зареждане на страницата</strong>.</p>
<h3>Бързодействие при зареждане на страница</h3>
<p>Колкото и да е голям по обем твоя сайт, зареждането на началната страница трябва да бъде максимално бързо. Това се постига, чрез цялостно или частично кеширане на страницата. Бързодействието е важно основно по две причини:</p>
<p>1. Посетителите бързо ще загубят доверие в сайта, ако той редовно се зарежда бавно.  Повечето ще се подразнят и ще спрат да го посещават и ще потърсят друг подобен сайт.</p>
<p>2. Поради <a href="http://ganbox.com/seo">SEO</a> причини. Роботите на търсачките имат зададено време на изчакване за зареждане на страницата, която индексират. Ако страницата е прекалено бавна, тя няма да се индексира изобщо или ще се индексира частично. В резултат на това сайтът започва да се класира лошо по все повече ключови думи за търсене.</p>
<h3>Сигурност при зареждане на страница</h3>
<p>Тук под термина сигурност имам предвид, че началната страница е особено критична и трябва да се зареди на всяка цена. Щом уеб сървърът работи, страницата трябва да се зареди, дори и ако SQL сървъра е претоварен или недостъпен. Глупаво е да падне началната страница на твоя бизнес сайт, защото имало проблем с базата данни. При сайтове на споделен хостинг често много сайтове ползват един SQL сървър. Например към момента superhosting не ползват специален софтуер за виртуализация и ако един сайт претовари базата данни, много други сайтове, които нямат вина ще пострадат. Към момента те си решават този проблем с денонощно наблюдение.</p>
<p>Решаването на проблема с отпадане на базата данни се постига, като блокове от началната страница, в които се зарежда информация от базата данни или информация от друг сайт, се обработват по специален начин. Има два подхода или да се използва кеширане на тези блокове или да се ограничи времето за изчакване на всеки блок и ако няма резултат този блок просто не се зарежда. В примера от тази статия аз използвам комбиниран подход. Само ще спомена, че има вариант, при който може да се кешира цялата страница, но той не е толкова гъвкав, защото различни блокове може да е необходимо да се опресняват през различни интервали от време в зависимост от информацията, която съдържат. Например блок с новини извличани от друг сайт ще искаш да се опресняват през 5 мин., защото каква е ползата да съобщиш за заметресение часове след като се е случило. Докато блок със статии от блога, в който пишеш веднъж седмично е достатъчно да се опреснява веднъж на 12 часа. Има и още един вариант &#8211; блоковете да се зареждат с ajax, но това не е добре от SEO гледна точка.</p>
<h3>Кеширане на съдържанието</h3>
<p>Добре, стига приказки! Давай кода! <img src='http://ganbox.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Посочения код изисква PHP &gt;=5 заради DOMDocument и curl модул, като и двете се предлагат стандартно от повечето хостинг доставчици.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:1400px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># извличане на последните статии от блога<br />
</span><span style="color: #000088;">$rssArticleLimit</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># колко новини се показват<br />
</span><span style="color: #000088;">$cacheTime</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">7200</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># опресняване през 2 часа (в секунди 7200)<br />
</span><span style="color: #000088;">$rssCacheFilePath</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'blognews.html'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># път до кеш файла<br />
</span><span style="color: #000088;">$urlBlogRSS</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://feeds.feedburner.com/ganbox'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># url на RSS новини<br />
</span><br />
<span style="color: #666666; font-style: italic;"># следните две се ползват за проверка дали са извлечени всички данни<br />
</span><span style="color: #000088;">$rssMinLen</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">200</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># минимален брой символи във кеш файла<br />
</span><span style="color: #000088;">$rssLastTag</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;/div&gt;'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># кеш файла завършва с този таг<br />
</span><br />
<span style="color: #666666; font-style: italic;"># създаване или опресняване на кеш файла<br />
</span><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><a href="http://www.php.net/file_exists"><span style="color: #990000;">file_exists</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rssCacheFilePath</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;"># ако файлът все още не е създаден<br />
</span><span style="color: #339933;">||</span> <a href="http://www.php.net/filemtime"><span style="color: #990000;">filemtime</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rssCacheFilePath</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$cacheTime</span> <span style="color: #339933;">&lt;</span> <a href="http://www.php.net/time"><span style="color: #990000;">time</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;"># или е променен преди повече от 2 часа<br />
</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000088;">$xml</span> <span style="color: #339933;">=</span> get_page_content<span style="color: #009900;">&#40;</span><span style="color: #000088;">$urlBlogRSS</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">14</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #666666; font-style: italic;">/* само 8 сек. време за свързване и 14 сек. общо време за изпълнение, увеличи ако трябва */</span><br />
&nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><a href="http://www.php.net/empty"><span style="color: #990000;">empty</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$xml</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$htmlData</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/* от XML в масив */</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$doc</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DOMDocument<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$doc</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadXML</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$xml</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000088;">$arrFeeds</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$doc</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'item'</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$node</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$itemRSS</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a> <span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'title'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$node</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">item</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nodeValue</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'desc'</span> &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$node</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'description'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">item</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nodeValue</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'link'</span> &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$node</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'link'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">item</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nodeValue</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'date'</span> &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$node</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'pubDate'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">item</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nodeValue</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array_push"><span style="color: #990000;">array_push</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arrFeeds</span><span style="color: #339933;">,</span> <span style="color: #000088;">$itemRSS</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/* от масив в HTML */</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000088;">$rssTitle</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$rssArticleLimit</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">'Последна статия'</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;Последните <span style="color: #006699; font-weight: bold;">$rssArticleLimit</span> статии от блога&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000088;">$htmlData</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&lt;h2&gt;<span style="color: #006699; font-weight: bold;">$rssTitle</span>&lt;/h2&gt;&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000088;">$feedCount</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arrFeeds</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$oneItem</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/* при мен базата има кодиране utf-8, а началната страница cp1251 следващия ред вероятно няма да ти трябва */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$oneItem</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000088;">$oneItem</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><a href="http://www.php.net/iconv"><span style="color: #990000;">iconv</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'utf-8'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'cp1251'</span><span style="color: #339933;">,</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$feedCount</span><span style="color: #339933;">++;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$htmlData</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;div&gt;&lt;h3&gt;&lt;a href=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$oneItem</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'link'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot; class=&quot;feedLink&quot;&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$oneItem</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/a&gt;&lt;/h3&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$htmlData</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;p&gt;'</span><span style="color: #339933;">.</span>my_chunk_split<span style="color: #009900;">&#40;</span><span style="color: #000088;">$oneItem</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'desc'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/p&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$htmlData</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$rssLastTag</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rssArticleLimit</span><span style="color: #339933;">&gt;</span><span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$feedCount</span><span style="color: #339933;">&gt;=</span><span style="color: #000088;">$rssArticleLimit</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/* това което е върнал сървъра не е XML и вероятно е някаква грешка изпрати си имейл с този $xml */</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000088;">$mail_text</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'FILE'</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>LINE:&quot;</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">__LINE__</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>ERROR: това което върна RSS сървъра не прилича на XML<span style="color: #000099; font-weight: bold;">\n</span>XML:<span style="color: #006699; font-weight: bold;">$xml</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; SendEmail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$mail_text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><a href="http://www.php.net/empty"><span style="color: #990000;">empty</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$htmlData</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">/* ако са извлечени данни успешно */</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/strlen"><span style="color: #990000;">strlen</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$htmlData</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$rssMinLen</span> <span style="color: #339933;">&amp;&amp;</span> <a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'|'</span><span style="color: #339933;">.</span><span style="color: #000088;">$rssLastTag</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'$|'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$htmlData</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> &nbsp;<span style="color: #666666; font-style: italic;">/* още една проверка дали са извлечени всички данни */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$fh</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><a href="http://www.php.net/fopen"><span style="color: #990000;">fopen</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rssCacheFilePath</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'w'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* презаписва файл */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fh</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">@</span><a href="http://www.php.net/fwrite"><span style="color: #990000;">fwrite</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fh</span><span style="color: #339933;">,</span> <span style="color: #000088;">$htmlData</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">@</span><a href="http://www.php.net/fclose"><span style="color: #990000;">fclose</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fh</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span> &nbsp;<span style="color: #666666; font-style: italic;">/* имейл до теб, че има проблем с писане в кеш файла */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$mail_text</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'FILE'</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>LINE:&quot;</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">__LINE__</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>ERROR: проблем с писане в кеш файла <span style="color: #006699; font-weight: bold;">$rssCacheFilePath</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SendEmail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$mail_text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span> &nbsp;<span style="color: #666666; font-style: italic;">/* времето за изчакване на RSS сървъра да върне отговор е изтекло */</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$mail_text</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'FILE'</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>LINE:&quot;</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">__LINE__</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>ERROR: времето за изчакване на RSS е изтекло<span style="color: #000099; font-weight: bold;">\n</span>XML:<span style="color: #006699; font-weight: bold;">$xml</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; SendEmail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$mail_text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #666666; font-style: italic;">/* показване на кеш файла, ако съдържа нещо */</span><br />
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/file_exists"><span style="color: #990000;">file_exists</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rssCacheFilePath</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000088;">$htmlData</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/file_get_contents"><span style="color: #990000;">file_get_contents</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rssCacheFilePath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/strlen"><span style="color: #990000;">strlen</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$htmlData</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$rssMinLen</span> <span style="color: #339933;">&amp;&amp;</span> <a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'|'</span><span style="color: #339933;">.</span><span style="color: #000088;">$rssLastTag</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'$|'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$htmlData</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> &nbsp;<span style="color: #666666; font-style: italic;">/* проверка дали са извлечени всички данни */</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">print</span> <span style="color: #000088;">$htmlData</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span> &nbsp;<span style="color: #666666; font-style: italic;">/* едва ли ще се случи но за всеки случай си изпрати имейл, че кеш файла е непълен */</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$mail_text</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'FILE'</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>LINE:&quot;</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">__LINE__</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>ERROR: непълен кеш файл <span style="color: #006699; font-weight: bold;">$rssCacheFilePath</span> чупи началната страница<span style="color: #000099; font-weight: bold;">\n</span>HTML: <span style="color: #006699; font-weight: bold;">$htmlData</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; SendEmail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$mail_text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<h3>Обяснения на кода</h3>
<p>При първото зареждане на страницата от посетител се извличат данните от RSS, преобразуват се в HTML и се записват във файл. При всяко следващо зареждане се проверява възрастта на кеш файла, ако е пресен се взема съдържанието му е се отпечатва светкавично в блока. Всичко останало от страницата, което няма нещо общо с база данни, се генерира от PHP.  Ако файлът е остарял се прави опит да се извлекат данни от RSS, като се изчаква само няколко секунди. Ако времето е недостатъчно или в момента няма връзка с базата данни, администратора на сайта ще получи имейл и данните ще се заредят от кеш файла. Това ще забави зареждането на страницата само няколко секунди.  Администраторът ще трябва да увеличи времето за изчакване, иначе ще получава периодично писма. В този пример са дадени стойности 8 и 14 сек. По този начин имаме само две положения: страницата се зарежда моментално или страницата се бави няколко секунди, след което се зарежда, като съдържанието на блока е от кеша и се уведомява администратора, че има проблем. Посочения метод има само един недостатък &#8211; след като пуснеш статия тя ще се появи със закъснение в началната страница. Това закъснение в примера е от 0 до 2 часа. Ако пишеш често, например по няколко статии на ден, може да намалиш времето на $cacheTime=1800; # половин час.</p>
<h3>Използвани функции</h3>
<p><b>get_page_content($url)</b> &#8211; извлича съдържанието на страница като ползва curl библиотека, ако зададеното време изтече без да има резултат скрипта продължава.<br />
Кодът на функцията е даден в статията <a href="/blog/php-извличане-текст-от-интернет-страниц/">PHP: Извличане текст от интернет страница</a>.</p>
<p><b>my_chunk_split($str)</b> &#8211; Ако текста съдържа дълги низове ги пренася на следващия ред при достигане на width последователни знака. При мен лявата колона е тясна и ако текста съдържа низ с повече от 28 знака един до друг без интервал, това кара текста да излезе от лявата колона и да навлезе в средната бяла колона.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> my_chunk_split<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span> <span style="color: #000088;">$width</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">28</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000088;">$stmp</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/base64_encode"><span style="color: #990000;">base64_encode</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/strlen"><span style="color: #990000;">strlen</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$stmp</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$out</span> <span style="color: #339933;">=</span>  <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$done</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$done</span><span style="color: #339933;">&lt;</span><span style="color: #000088;">$len</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$out</span><span style="color: #339933;">.=</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$len</span><span style="color: #339933;">-</span><span style="color: #000088;">$done</span><span style="color: #339933;">&gt;</span><span style="color: #000088;">$width</span><span style="color: #009900;">&#41;</span> ? <a href="http://www.php.net/substr"><span style="color: #990000;">substr</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span> <span style="color: #000088;">$done</span><span style="color: #339933;">,</span> <span style="color: #000088;">$width</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <br />
&nbsp; &nbsp; &nbsp; <span style="color: #339933;">:</span> <a href="http://www.php.net/substr"><span style="color: #990000;">substr</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span> <span style="color: #000088;">$done</span><span style="color: #339933;">,</span> <span style="color: #000088;">$len</span><span style="color: #339933;">-</span><span style="color: #000088;">$done</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$done</span><span style="color: #339933;">+=</span><span style="color: #000088;">$width</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$out</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p><b>SendEmail($text)</b> &#8211; изпраща text до администратора на сайта. Всеки може да си напише или да ползва библиотека (или просто да постъпи небрежно и да коментира тази функция в кода), затова няма да дам кода на функцията тук.</p>
<p>Ако твоя сайт се зарежда бавно и искаш оптимизиране на бързодействието може да се свържеш с мен за оферта от <a href="http://ganbox.com/about">тук</a>.</p>
<p>При проблеми с този код пиши коментари по статията.<br />
.<br />
.<br />
Подобни статии:<br />
<a href="/blog/php-%d0%bf%d0%b0%d1%80%d1%81%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-xml-%d0%bd%d0%be%d0%b2%d0%b8%d0%bd%d0%b8-%d0%b7%d0%b0-%d1%82%d0%b2%d0%be%d1%8f-%d1%81%d0%b0%d0%b9%d1%82/">PHP парсване на XML новини за твоя сайт</a><br />
<a href="/blog/php-извличане-текст-от-интернет-страниц/">PHP: Извличане текст от интернет страница</a></p>
<div style="float:right;display:block" class="counterViews">Брой разглеждания на тази статия: <b>4160</b><br /><span style="color:grey;font-size:0.8em">(след дата 20 декември 2009)</span></div>

<p>Подобни статии:<ol><li><a href='http://ganbox.com/blog/%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-sql-%d0%b7%d0%b0%d1%8f%d0%b2%d0%ba%d0%b8/' rel='bookmark' title='Permanent Link: Оптимизиране на SQL заявки'>Оптимизиране на SQL заявки</a> <small>Основни положения при оптимизация на mySQL Обикновено проблемите с бавни...</small></li>
<li><a href='http://ganbox.com/blog/php-%d0%bf%d0%b0%d1%80%d1%81%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-xml-%d0%bd%d0%be%d0%b2%d0%b8%d0%bd%d0%b8-%d0%b7%d0%b0-%d1%82%d0%b2%d0%be%d1%8f-%d1%81%d0%b0%d0%b9%d1%82/' rel='bookmark' title='Permanent Link: PHP парсване на XML новини за твоя сайт'>PHP парсване на XML новини за твоя сайт</a> <small>Ще ти покажа малко PHP код, с който много лесно...</small></li>
<li><a href='http://ganbox.com/blog/%d0%b7%d0%b0%d1%80%d0%b5%d0%b6%d0%b4%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%b4%d0%b0%d0%bd%d0%bd%d0%b8-%d1%81-ajax-%d0%be%d1%82-%d0%be%d1%82%d0%b4%d0%b0%d0%bb%d0%b5%d1%87%d0%b5%d0%bd-%d1%81%d1%8a%d1%80/' rel='bookmark' title='Permanent Link: Зареждане на данни с Ajax от отдалечен сървър'>Зареждане на данни с Ajax от отдалечен сървър</a> <small>Задача за оптимизиране бързината на сайт Наскоро работих по сайта...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://ganbox.com/blog/%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%b1%d1%8a%d1%80%d0%b7%d0%be%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d0%b5%d1%82%d0%be/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 38/88 queries in 0.067 seconds using disk: basic

Served from: ganbox.com @ 2012-05-22 06:10:36 -->
