Давно хотел поделиться с читателями классом кэширования данных выводимых скриптом. Зачем вообще использовать кэширование и что нужно кэшировать?

Когда вы запрашиваете страницу, сервер собирает ее на PHP. Время сборки всегда зависит от скорости выполнения скриптов. Например, если на сайте имеются блоки, которые не требуют частого обновления их можно кэшировать.

Что за блоки? Например это может быть многоуровневое меню выводимое из базы, последние посты в блоге или комментарии или любая другая информация. Кэшируя этот вывод в файл мы избавляемся от ненужных запросов в базу.

Часто скрипт дает ускорение в ого-го раз :)

И так, привожу сразу листинг самого класса:

<?
class cache {
	var $cache;
	var $cacheurl;
	var $modif;
	var $its_all_cache_menu_ok;
	var $fullurl;

function CacheStart($urlglobal,$timecache,$path) {
	$this->cacheurl="cache_".md5($urlglobal);
	$this->fullurl=$path.$this->cacheurl;
	$this->modif=time()-@filemtime ($this->fullurl);
	if ($this->modif<$timecache){
		include ($this->fullurl);
		$this->its_all_cache_menu_ok=1;
	}
}	

function CacheInit() {
	ob_start();
}

function CacheClean() {
	ob_end_clean();
}

function CacheGet () {
	$this->cache = ob_get_contents();
	return $this->cache;
}

function CacheInputAndWrite() {
	echo $this->cache;
	$fp = @fopen ($this->fullurl, "w");
	@fwrite ($fp, $this->cache);
	@fclose ($fp);
}
}
?>

А использовать класс очень просто, в том месте где вы подгружаете файл или модуль:

Вместо

<?php
include 'sidebar.php';
?>

Пишем

<?php
$classcache = new cache();
// Кэширование боковой части с категориями
$classcache->CacheStart($_SERVER['REQUEST_URI'], 3600, rtrim($_SERVER['DOCUMENT_ROOT'],'/')."/cache/");
if ($classcache->its_all_cache_menu_ok!=1) {
	$classcache->CacheInit();
	include 'sidebar.php';
	$classcache->CacheGet();
	$classcache->CacheClean();
	$classcache->CacheInputAndWrite();
}
unset($classcache);			
?>

В функцию CacheStart мы передаем три параметра:

Первый - текущая страница, или любой другой идентификатор уникальный для данного кэша. Например можно брать не только текущий URL, но и например текущий раздел. Если этот блок для всех страниц одинаковый, то просто поставьте название раздела, например "main_photo_frame".

Второй - время в секундах, на которое мы кэшируем блок. 3600 секунд это час.

Третий - Путь, куда мы будем складывать кэш вывода скрипта. Не забудьте поставить права на папку 777.

 

Скрипт работает просто. Сначала скрипт проверяет наличие файла и если он есть, сверяет время его создания. Если он устарел, или файла кэша нет, то буферизирует вывод и записывает его в файл кэша.

Надеюсь этот класс окажется для вас полезным.

(Visited 303 times, 1 visits today)