Прехвърляне към съдържание


Снимка

Статия: PHP Кеширане


  • Моля, влезте, за да отговорите
Няма отговори по тази тема

#1 Crio

Crio

    Knowledge is Power

  • Глобални модератори
  • ПипПипПипПипПипПип
  • 457 мнения
  • Пол:Мъж

Публикувано: 20 July 2011 - 16:53

УВОД


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

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

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


Публикувано изображение




ПРАКТИКА


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

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

  • Заявяване на страницата от потребителя.
  • Заявки към базата данни.
  • Зареждане на шаблоните за страницата.
  • Попълване на шаблоните със съответните извлечени данни.
  • Изпращане на страницата към потребителя.


При процес подобен на описания по-горе и 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)

I believe in a world I can and do understand. A rational universe, explained through rational means.





0 потребители четат тази тема

0 регистрирани потребители, 0 гости и 0 анонимни потребители