Jump to content

Препоръчан пост

УВОД

 

В днешно време по-голямата част от интернет пространството е запълнена с динамични сайтове, разчитащи на комплексни системи, които работят с най-различни видове методи за запазване на информацията от сайта. Като това най-често е MySQL, MSSQL или PgSQL база с данни. Съществуват адски много начини за запазване на данните, кой от кой по-мощен, гъвкав и натоварващ системата.

 

Полезното при динамичните сайтове е, че данните могат да бъдат обработвани директно през обособени администраторски панели и редактори като чист текст. И всичко това да бъде обработвано от PHP и показвано във форматирани страници. Без да е нужно да си специалист в HTML, CSS или PHP. Лошата страна на динамично генерираното съдържание е времето за обработка на съответната страница, което натоварва допълнително сървъра, защото една страница може да генерира множество заявки до бази с данни и файлове. Тази задача може да стане изключително сложна и гладна за изчислителна мощ на по-големи сайтове с множество източници на съдържание в страницата (например нашия).

 

В интерес на истината, така наречените „динамични“ страници за жалост не са чак толкова динамични. В повечето случаи след попълването на съдържанието в страницата, то остава такова за изключително дълго време (понякога не се и променя). И все пак всеки път когато някой потребител отвори съответната страница, системата ни прави заявки към базата данни, филтрира и обработва съдържанието и чак тогава го показва на потребителя. Тоест съдържанието си е статично, просто бива сглабяно от PHP интерпретатора всеки път преди да бъде показано на потребителя.

 

http://softvisia.com/svd/cache.png

 

 

 

ПРАКТИКА

 

За да избегнем това натоварване върху сървъра и да направим зареждането на страниците от сайта си по-бързо ще прибегнем до кеширане на съдържанието. Вместо страницата да бъде генерирана всеки път, може да запишем генерираното съдържание при първото посещение и при следващите просто да изпращаме записаното „динамично“ съдържание, докато то е актуално.

 

На изображението по-горе се вижда системата по която работи процеса на кеширането. Ако премахнем елемента с кешираното съдържание, се получава следното:

 


  1.  

  2. Заявяване на страницата от потребителя.

  3. Заявки към базата данни.

  4. Зареждане на шаблоните за страницата.

  5. Попълване на шаблоните със съответните извлечени данни.

  6. Изпращане на страницата към потребителя.

 

При процес подобен на описания по-горе и 100-200 посещения на ден, използването на система за кеширане едва ли е толкова наложителна. Но ако получавате по 10-20 хиляди посещения ежедневно определено кеширането ще бъде пръв приятел на вашия сървър. Тоест колкото по-сложен е процеса по генерирането на страниците на сайта ви и колкото повече посещения имате, толкова повече се нуждаете от система за кеширане.

 

Важно е да отбележа, че горната схема е груб пример за процеса на кеширане на теория. Реално при по-сложни страници, които имат множество карета с динамична информация процеса на кеширане може да бъде значително по-сложен.

 

 

 

 

ИМПЛЕМЕНТАЦИЯ

 

Нека кажем, че имате уебсайт за уроци и статии, който получава по 20000 посещения ежедневно. Статия от уеб сайтът ви се зарежда чрез препратка тип:

Което реално прехвърля потребителя към:

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
Сподели другаде

Гост
Отговори на тази тема

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   Не можете да качите директно снимка. Качете или добавете изображението от линк (URL)

Loading...
×
×
  • Създай ново...