crio Публикувано Юли 20, 2011 Report Share Публикувано Юли 20, 2011 УВОД В днешно време по-голямата част от интернет пространството е запълнена с динамични сайтове, разчитащи на комплексни системи, които работят с най-различни видове методи за запазване на информацията от сайта. Като това най-често е MySQL, MSSQL или PgSQL база с данни. Съществуват адски много начини за запазване на данните, кой от кой по-мощен, гъвкав и натоварващ системата. Полезното при динамичните сайтове е, че данните могат да бъдат обработвани директно през обособени администраторски панели и редактори като чист текст. И всичко това да бъде обработвано от PHP и показвано във форматирани страници. Без да е нужно да си специалист в HTML, CSS или PHP. Лошата страна на динамично генерираното съдържание е времето за обработка на съответната страница, което натоварва допълнително сървъра, защото една страница може да генерира множество заявки до бази с данни и файлове. Тази задача може да стане изключително сложна и гладна за изчислителна мощ на по-големи сайтове с множество източници на съдържание в страницата (например нашия). В интерес на истината, така наречените „динамични“ страници за жалост не са чак толкова динамични. В повечето случаи след попълването на съдържанието в страницата, то остава такова за изключително дълго време (понякога не се и променя). И все пак всеки път когато някой потребител отвори съответната страница, системата ни прави заявки към базата данни, филтрира и обработва съдържанието и чак тогава го показва на потребителя. Тоест съдържанието си е статично, просто бива сглабяно от PHP интерпретатора всеки път преди да бъде показано на потребителя. http://softvisia.com/svd/cache.png ПРАКТИКА За да избегнем това натоварване върху сървъра и да направим зареждането на страниците от сайта си по-бързо ще прибегнем до кеширане на съдържанието. Вместо страницата да бъде генерирана всеки път, може да запишем генерираното съдържание при първото посещение и при следващите просто да изпращаме записаното „динамично“ съдържание, докато то е актуално. На изображението по-горе се вижда системата по която работи процеса на кеширането. Ако премахнем елемента с кешираното съдържание, се получава следното: Заявяване на страницата от потребителя.Заявки към базата данни.Зареждане на шаблоните за страницата.Попълване на шаблоните със съответните извлечени данни.Изпращане на страницата към потребителя. При процес подобен на описания по-горе и 100-200 посещения на ден, използването на система за кеширане едва ли е толкова наложителна. Но ако получавате по 10-20 хиляди посещения ежедневно определено кеширането ще бъде пръв приятел на вашия сървър. Тоест колкото по-сложен е процеса по генерирането на страниците на сайта ви и колкото повече посещения имате, толкова повече се нуждаете от система за кеширане. Важно е да отбележа, че горната схема е груб пример за процеса на кеширане на теория. Реално при по-сложни страници, които имат множество карета с динамична информация процеса на кеширане може да бъде значително по-сложен. ИМПЛЕМЕНТАЦИЯ Нека кажем, че имате уебсайт за уроци и статии, който получава по 20000 посещения ежедневно. Статия от уеб сайтът ви се зарежда чрез препратка тип:http://example.com/articles/123Което реално прехвърля потребителя към:http://example.com/articles.php?id=123Нашата имплементация за кеширане ще записва кешираното съдържание в папка “cache/” спрямо root папката на съдържанието ни. Тоест връзката до кешираният файл ще изглежда така:http://example.com/cache/articles.123.htmlСамото кеширане е елементарна процедура, която се състои в записване на съдържанието в текстов файл. По-сложно е определенянето на актуалността на данните в кеша. Ще ви обясня два начина за проверка на актуалността на данните в кеша: Първия е може би по-неефективния, но е и по-лесен за имплементация. Кеширането на данните става през определено време, което може да нагласите спрямо посещаемостта на страницата си. Например може да направите началната страница да има кеш с валидност 5 минути, след изтичането му тя бива генерирана наново от скрипта. Лошата страна на този вариант е, че до изтичането на „живота“ на кеша, потребителите ще получават само информация, която не е актуална (при евентуално обновяване). <?php $id = strval($_GET["id"]); $cacheTime = 7 * 24 * 60 * 60; // Седмица в секунди; $cacheFile = "cache/articles.$id.html"; // Проверка дали файлът съществува и дали е актуален. if(file_exists($cacheFile) && (time() - $cachetime < filemtime($cacheFile))){ // Показване на актуалното кеширано копие. include("cache/articles.$id.html"); exit; }else{ // Файл с главните функции на сайта ви. include('site.php'); // Прочитане на съответната статия от базата данни $result = mysql_query("SELECT * FROM `articles` WHERE `id`='$id'"); $article = mysql_fetch_assoc($result); // Елементарен клас за шаблони. $template = new Template("templates/article.html"); $template->addVariable("%TITLE%",$article->title); $template->addVariable("%CONTENT%",$article->content); $template->addVariable("%AUTHOR%",$article->author); // Обработка на шаблона и връщане на съдържанието му като низ. $cachedContent = $template->parse(); echo $cachedContent; // Запазване на копие в кеша $cachedFile = fopen($cacheFile, "w") if($cachedFile){ fwrite($cachedFile, $cachedContent); fclose($cachedFile); } } ?> Вторият метод включва проверка в базата данни за датата/часът на последната модификация на данните, този метод е по-сложен, но и по-ефективен. Въпреки, че добавя съвсем малко повече натоварване на сървъра, препоръчвам точно него. При него данните винаги са актуални, тъй като валидността на данните се проверява при всяко посещение. <?php // Файл с главните функции на сайта ви. include('site.php'); $id = strval($_GET["id"]); //Взимаме modified полето от таблицата със статиите, което е записана time() стойност; $result = mysql_query("SELECT `modified` FROM `articles` WHERE `id`='$id'"); $time = mysql_fetch_assoc($result); $cacheFile = "cache/articles.$id.html"; // Проверка дали файлът съществува и дали е по-млад от датата на последната модификация. if(file_exists($cacheFile) && ($time->modified < filemtime($cacheFile))){ // Показване на актуалното кеширано копие. include("cache/articles.$id.html"); exit; }else{ // Прочитане на съответната статия от базата данни $result = mysql_query("SELECT * FROM `articles` WHERE `id`='$id'"); $article = mysql_fetch_assoc($result); // Елементарен клас за шаблони. $template = new Template("templates/article.html"); $template->addVariable("%TITLE%",$article->title); $template->addVariable("%CONTENT%",$article->content); $template->addVariable("%AUTHOR%",$article->author); // Обработка на шаблона и връщане на съдържанието му като низ. $cachedContent = $template->parse(); echo $cachedContent; // Запазване на копие в кеша $cachedFile = fopen($cacheFile, "w") if($cachedFile){ fwrite($cachedFile, $cachedContent); fclose($cachedFile); } } ?> ЗАКЛЮЧЕНИЕ Системите за кеширане описани по-горе могат наистина да освободят сървърните ресурси, което ще разшири възможностите за имплементация на нови по-сложни и по-добри функции във вашият сайт. Ако сте очаквали да се научите как да направите система за кеширане с комерсиално качество от тази статия, съжaлявам че ви разочаровам. Статията не е урок с подобен замисъл, а има за цел да ви запознае с предимствата на кеширането. За повече информация по темата: http://www.php.net/manual/en/ref.outcontrol.php - Output Control функции в PHP.http://pastebin.com/XNm2fQbn – PHP Template клас като използвания в кода за статията.http://www.php.net/manual/en/ref.datetime.php - Date/Time функции PHP.http://en.wikipedia.org/wiki/Cache - Статия за общото понятие „кеширане“. Моля, не копирате материала или части от него, без да посочвате източника. Автор: Милен Чакалов (Crio) Цитирай Link to comment Сподели другаде More sharing options...
Препоръчан пост