<?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; съвет</title>
	<atom:link href="http://ganbox.com/blog/tag/%d1%81%d1%8a%d0%b2%d0%b5%d1%82/feed/" rel="self" type="application/rss+xml" />
	<link>http://ganbox.com/blog</link>
	<description>SEO практика: трикове при оптимизация и решаване на проблеми при уеб програмиране.</description>
	<lastBuildDate>Thu, 26 Jan 2012 19:15:58 +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>Зареждане на данни с Ajax от отдалечен сървър</title>
		<link>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/</link>
		<comments>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/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 09:48:49 +0000</pubDate>
		<dc:creator>Георги Стефанов</dc:creator>
				<category><![CDATA[Уеб програмиране]]></category>
		<category><![CDATA[Ajax]]></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=737</guid>
		<description><![CDATA[Задача за оптимизиране бързината на сайт Наскоро работих по сайта Речник на думите в българския език. В този сайт при търсене по някоя дума в дясната колона се зарежда блок с подобни думи. Подобните думи са такива, които се получават от търсената дума с добавяне, премахване или подмяна на една или две букви. За откриването [...]]]></description>
			<content:encoded><![CDATA[<h3>Задача за оптимизиране бързината на сайт</h3>
<p>Наскоро работих по сайта <a href="http://rechnik.info/">Речник на думите в българския език. </a>В този сайт при търсене по някоя дума в дясната колона се зарежда блок с подобни думи. Подобните думи са такива, които се получават от търсената дума с добавяне, премахване или подмяна на една или две букви. За откриването на такива думи се използва алгоритъм с висока степен на сложност, който е бавен, защото претърсва цялата таблица с думи. Таблицата беше с размер около 100 000 реда и нарастваше и в резултат на това зареждането на страницата се бавеше до към 30 секунди &#8211; прекалено дълго време за уеб страница. Задачата ми беше да измисля начин за <a href="http://ganbox.com/seo-uslugi#оптимизиране-бързодействие">оптимизиране на бързодействието на сайта</a>.</p>
<h3>Решение</h3>
<p>Първото, което направих е да опитам да оптимизирам SQL заявката. Ползваният алгоритъм не подлежи на <strong>оптимизация</strong>, затова се наложи да прибягна до някои дребни хитрости. Например търсене на подобни думи в ограничен набор от думи с дължина +/-2 спрямо дължината на търсената дума. Създадох някои допълнителни индекси на SQL таблиците и успях да съкратя средното време на около 8 секунди. Да чакаш цялата страница 8 секунди също е прекалено досадно и затова направих блока с подобни думи да се зарежда с Ajax. По този начин страницата се показваше веднага и само блока се бавеше, което беше напълно допустимо. Вече си мислех, че съм приключил, когато дойде писмо от хостинг доставчика, че се ползва прекалено бавна заявка, която бави другите сайтове на този споделен хостинг и настояваха да се <strong>оптимизира</strong>. Така стигнах до идеята, че данните за подобните думи трябва да се зареждат от отдалечен сървър. За да стане възможно това, трябва отдалеченият сървър да има същата таблица с думи в базата си данни. Направих автоматичен скрипт, който периодично да копира таблиците от единия сървър на другия. По този начин освен всичко друго се получи и още един архив на данните. След това оставаше да направя Ajax да се обръща към новия сървър. Тук отново има проблем: от съображения за сигурност Ajax не може да се обръща към домейн различен от този, на който се изпълнява. За да заобиколя това ограничение аз използвам следната програмистка техника: Ajax се обръща към скрипта similarClient.php разположен локално на сървъра на rechnik.info, който прави заявка към скрипт с име words.php на отдалечения сървър. Там се търси за подобни думи в копието на базата данни и намерения резултат се изпраща към similarClient.php, който го връща като резултат към Ajax. Към цялата система се добавя и кеширане на заявките, локално върху отдалечения сървър &#8211; този подход спестява дисково пространство на хостинга за сметка на увеличен трафик. При първото търсене в речника по дадена дума резултата се бави няколко секунди, но при всяко следващо търсене по тази дума, резултата се взема от кеш и става почти моментално. Всичко това може да изглежда малко сложно, но можеш да видиш колко добре действа в сайта на <a href="http://rechnik.info">Речника</a>.</p>
<h3>Сигурност</h3>
<p>Скриптът разположен на отдалечения сървър, който получава дума и връща списък с подобни думи е уеб скрипт и се извиква през HTTP. Това означава, че всеки който знае URL адреса и какви параметри приема, може лесно да използва това за свои цели и да прави заявки към сървъра. Използвайки горния метод, аз скривам URL адреса и това повишава сигурността многократно. Въпреки това е възможно връзката да бъде подслушана или логовете на сървъра да станат достъпни публично. Това ще разкрие URL адреса и някой може да се възползва. Затова един съвет: никога не разчитай само на сложен и таен URL адрес на скрипт!</p>
<p>Аз използвам допълнителни механизми за защита: отдалеченият сървър приема заявки само от IP адреса на rechnik.info. Това увеличава сигурността, но за съжаление не е напълно достатъчно, защото е възможно да пристигнат заявки с фалшифициран IP адрес. Следващиата стъпка е добавяне на кодиран параметър в GET заявката. По този начин URL адреса на заявката прилича на следния:</p>
<pre>http://remote.domain.com/words.php?a=дума&amp;code=a4b25d814f32b2c852c3d71d3</pre>
<p>Низа подаван в променливата &#8222;code&#8220;, е кодирана от скрипта similarClient.php и само скрипта words.php знае как да го разкодира и да разбере дали е валиден. Резултат се връща, само ако стойността е валидна, в противен случай опита се записва и се съобщава на админ. За да може някой да хакне това, трябва да има FTP достъп до някой от двата php файла.Следващата стъпка е ползване на HTTPS вместо HTTP, но тук вече навлизаме в сферата на банковия софтуер <img src='http://ganbox.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Сигурен съм, че много хора ще се запитат: &#8222;За какво е всичко това? Какво толкова защитаваш?&#8220;.</p>
<p>Нека да кажем, че се упражнявам <img src='http://ganbox.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Не обичам да оставям нещата на случайността и не правя компромиси със сигурността. Винаги изпипвам нещата и се подсигурявам двойно. Препоръчвам ти да се научиш да работиш по този начин.</p>
<h3>SEO</h3>
<p>Описаната система си има и недостатъци. От <a href="http://ganbox.com/seo">SEO</a> гледна точка връзките в блока Подобни думи са невидими за търсачките. За да може сайта да се индексира добре е нужен или Google sitemap, или допълнителен блок с връзки като този със &#8222;Случайни думи&#8220;. Още по-добра работа би свършил блок със &#8222;Съседни думи&#8220;, в който за дадена страница връзките винаги да са едни и същи.</p>
<div style="float:right;display:block" class="counterViews">Брой разглеждания на тази статия: <b>3332</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%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>
</ol></p>]]></content:encoded>
			<wfw:commentRss>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/feed/</wfw:commentRss>
		<slash:comments>9</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>3695</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>3936</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>
		<item>
		<title>Бъг в WordPress: визуалния редактор не работи</title>
		<link>http://ganbox.com/blog/%d0%b1%d1%8a%d0%b3-wordpress-%d0%b2%d0%b8%d0%b7%d1%83%d0%b0%d0%bb%d0%bd%d0%b8%d1%8f-%d1%80%d0%b5%d0%b4%d0%b0%d0%ba%d1%82%d0%be%d1%80/</link>
		<comments>http://ganbox.com/blog/%d0%b1%d1%8a%d0%b3-wordpress-%d0%b2%d0%b8%d0%b7%d1%83%d0%b0%d0%bb%d0%bd%d0%b8%d1%8f-%d1%80%d0%b5%d0%b4%d0%b0%d0%ba%d1%82%d0%be%d1%80/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 17:11:23 +0000</pubDate>
		<dc:creator>gan</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[бъг]]></category>
		<category><![CDATA[Визуалния редактор]]></category>
		<category><![CDATA[съвет]]></category>
		<category><![CDATA[хак]]></category>

		<guid isPermaLink="false">http://ganbox.com/blog/?p=557</guid>
		<description><![CDATA[Преди малко открих бъг в WordPress 2.8.4 (последната версия в момента). Грешка Докато за пореден път актуализирах любимата си статия Популяризиране на сайт с външни връзки, открих следния неприятен ефект &#8211; в админ панела при промяна на публикация визуалния редактор спира да зарежда текста и в долния десен ъгъл изчезна грапавото ъгълче за разтягане на [...]]]></description>
			<content:encoded><![CDATA[<p>Преди малко открих бъг в WordPress 2.8.4 (последната версия в момента).</p>
<h3><span style="color: #993300;">Грешка</span></h3>
<p>Докато за пореден път актуализирах любимата си статия <a href="http://ganbox.com/blog/популяризиране-на-сайт/">Популяризиране на сайт с външни връзки, </a>открих следния неприятен ефект &#8211; в админ панела при промяна на публикация визуалния редактор спира да зарежда текста и в долния десен ъгъл изчезна грапавото ъгълче за разтягане на полето с текста на публикацията. Така единствено в режим на HTML може да се промени статията.</p>
<h3>Проучване</h3>
<p>Разгледах внимателно цялата страница и забелязах, че страницата не се е заредила до края и не показва предишните версии на публикацията. В долния край на страницата има списък с предишни версии на публикацията, които се увеличават при всяка промяна на статията. Веднага след заглавието на списъка &#8222;Версии на публикацията&#8220; страницата завършваше. Разгледах други публикации от блога, но там нямаше проблем. Това ме наведе на мисълта, че грешката се дължи на големия брой версии на публикацията и дългия текст. За съжаление в момента нямам време да прегледам кода на WordPress, но вероятно всички предишни версии се зареждат в паметта и при голям брой версии страницата се чупи.</p>
<p>Отворих cpanel на хостинга и от там влязох в phpMyAdmin. След кратко разглеждане на таблицата с публикациите wp_posts разбрах как да изведа броя на предишния брой публикации.От адреса на страницата за промяна на публикация се вижда, че номера на публикацията е 125. Адреса е:  http://ganbox.com/blog/wp-admin/post.php?action=edit&amp;post=125</p>
<p>Изпълнява се следната SQL заявка:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT *  FROM `wp_posts` WHERE `post_name` LIKE '125-%'</div></div>
<p>Където 125 е номера на публикацията и при мен изведе<br />
<span style="color: #808080;">Showing rows 0 &#8211; 29 (82 total, Query took 0.0041 sec)</span></p>
<p>Вижда се, че има 82 версии на публикацията, като се добави и това, че текста е дълъг бях сигурен, че това е проблема.</p>
<p>За всеки случай си направих резервно копие на таблицата wp_posts и след това реших да поизтрия малко стари версии.</p>
<h3><span style="color: #008000;">Решение</span></h3>
<p>Първо изпълних заявката</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT *  FROM `wp_posts` WHERE `post_name` LIKE '125-%'<br />
AND post_date &lt; NOW() - INTERVAL 1 MONTH<br />
ORDER BY  post_date</div></div>
<p><span style="color: #808080;">Showing rows 0 &#8211; 29 (56 total, Query took 0.0173 sec)</span></p>
<p>Това ми показва, че има 56 версии по-стари от един месец.</p>
<p>Изтрих ги със заявката:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DELETE  FROM `wp_posts` WHERE `post_name` LIKE '125-%'<br />
AND post_date &lt; NOW() - INTERVAL 1 MONTH</div></div>
<p>Всичко си заработи нормално при промяна на публикацията.</p>
<p>Явно този бъг се проявява много рядко и само, когато сумарния текст от всички версии на една публикация е прекалено голям.  Ако и при теб &#8222;Визуалния редактор&#8220; на WordPress спре да зарежда текста може да пробваш този хак.</p>
<p>Винаги прави резервни копия на базата данни преди да го използваш, <strong>ganbox.com</strong> не носи отговорност за проблеми възникнали от използването на този хак.</p>
<div style="float:right;display:block" class="counterViews">Брой разглеждания на тази статия: <b>3067</b><br /><span style="color:grey;font-size:0.8em">(след дата 20 декември 2009)</span></div>

<p>Подобни статии:<ol><li><a href='http://ganbox.com/blog/wordpress-2-9-%d0%bd%d0%b0-%d0%b1%d1%8a%d0%bb%d0%b3%d0%b0%d1%80%d1%81%d0%ba%d0%b8/' rel='bookmark' title='Permanent Link: WordPress 2.9 на български'>WordPress 2.9 на български</a> <small>Както сигурно вече си видял днес излезе новата версия на...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://ganbox.com/blog/%d0%b1%d1%8a%d0%b3-wordpress-%d0%b2%d0%b8%d0%b7%d1%83%d0%b0%d0%bb%d0%bd%d0%b8%d1%8f-%d1%80%d0%b5%d0%b4%d0%b0%d0%ba%d1%82%d0%be%d1%80/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

