Warning: array_merge(): Argument #2 is not an array in /hsphere/local/home/magistr/codeismy.name/wp-content/plugins/wp-pagenavi/scb/Options.php on line 46

CMS своими руками. Кэширование

Дата: Апрель 28, 2009

(0) комментариев

Думаю ни одна современная цмска не может обойтись без системы кэширования. Кэширование как известно помогает обеспечить быстродействие. Для этого используется буферизация вывода с помощью ob_start();
Принцип кэширования следующий:
- сначала проверяется наличие уже сохранённой странички
- если такая страничка найдена, то она инклудится и дальнейшее выполнение кода не происходит, если её не существует, то начинается буферизация вывода
- конечный результат вывода записывается в файл и инклудится.

А теперь приступим к реализации данного механизма. Все действия я подробно закаментирую в коде.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php

class Cache
{//Begin class
//Название класса
public $name="CachePage";
//Версия класса кэширования
public $version="_v_1.0";
//Хэш код файла
public $hash_code="";
//Переменная содержащая дату последнего кэширования, которую получаем в результате вычислений
public $modifi_file;
//Время последней модификации
//Устанавливается в секундах, по умолчанию 10 мин
public $time_file_cache=600;
//Хранение значения контента файла
//При буферизации
public $CONTENT;
/*
Главная функция кэшируемых файлов
*/
public function haupt_cache()
{
$this->code_file(); //Получение хэш кода файла
$this->clean_content(); //Получение и отчистка буфера
if($this->file_and_katalog_isset()==FALSE) $this->create_cache_file(); //Создания файла кэша если его нет
else $this->cache_file(); //Проверка последней модификации
if($this->modifi_file>$this->time_file_cache) $this->mod_file_cache(); //Модифицирование файла кэша
}
/*
Функция проверки существования файла и каталога кэширования
*/
public function file_and_katalog_isset()
{
if(file_exists($this->dir_cache."/".$this->hash_code.".php")) return TRUE; //Проверяет существование файла в каталоге кэширования
else return FALSE;
}
/*
Функция кэширования контента файла
*/
public function cache_content()
{
ob_start(); //Кэшируем контент файла
$this->dir_cache=DOC_ROOT."/vision/cache";
}
/*
Функция преобразования url файла в хэш код
*/
public function code_file()
{
$url=$GLOBALS['REQUEST_URI']; //Получаем url файла
$hashcode_file=md5($url); //Хэш код файла
$this->hash_code=$hashcode_file;
}
/*
Функция создания файла кэша если его нет в каталоге кэширования
*/
public function create_cache_file()
{
$open=fopen($this->dir_cache."/".$this->hash_code.".php", "at") or die(trigger_error("Невозможно открыть файл ".$this->hash_code.".php [".$this->name.$this->version."]", E_USER_ERROR)); //Создаём файл с кэшем
flock($open, LOCK_EX);//Блокируем файл
rewind($open); //Установка позиции в начало файла
$time_create_file=time(); //Время создания кэшируемого файла
$write_file=$this->CONTENT.""; //Формируем контент файла для записи
fwrite($open, $write_file); //Записываем данные
fclose($open); //Закрываем файл
readfile($this->dir_cache."/".$this->hash_code.".php");
}
/*
Функция проверки последнего кэширования файла
*/
public function cache_file()
{
$fopen=fopen($this->dir_cache."/".$this->hash_code.".php", "rt") or die(trigger_error("Невозможно открыть файл ".$this->hash_code.".php [".$this->name.$this->version."]", E_USER_ERROR)); //Открываем файл
$fread=fread($fopen, filesize($this->dir_cache."/".$this->hash_code.".php")); //Прочитываем контент файла
$time_mod=filectime($this->dir_cache."/".$this->hash_code.".php");
//preg_match_all("/()/i", $fread, $time_mod); //Ишем дату последней модификации файла
fclose($fopen);//Закрываем файл с кэшем
$mod_file=time()-$time_mod;
//$mod_file=time()-$time_mod[2][0]; //Время последнего кэширования файла
$this->modifi_file=$mod_file; //Присваиваем модификацию файла переменной
if($this->modifi_file<$this->time_file_cache) //Проверяем время последнего кэширования
{
readfile($this->dir_cache."/".$this->hash_code.".php"); //Подключаем файл
}
}
/*
Функция модификации файла если время полседнего кэширования истекло
*/
public function mod_file_cache()
{
unlink($this->dir_cache."/".$this->hash_code.".php"); //Удаляем кэшируемый файл так как время последней модификации истекло
$open=@fopen($this->dir_cache."/".$this->hash_code.".php", "at") or die(trigger_error("Невозможно открыть файл ".$this->hash_code.".php [".$this->name.$this->version."]", E_USER_ERROR)); //Открываем файл
flock($open, LOCK_EX);//Блокируем файл
rewind($open); //Установка

А теперь немного о том, как всем этим пользоваться
Для начала нам надо инициировать класс, делаем мы это следующим образом

1
$CACHE=new Cache;

Далее нам необходимо в начале кэшируемого участка вставить код

1
$CACHE->cache_content();

и в конце кода

1
$CACHE->haupt_cache();

для очистки кэша можно воспользоваться функцией

1
cleaning_cache_katalog("all");

если надо удалить только один файл кэша, то

1
cleaning_cache_katalog("file", стран
a




    Нет комментариев на "CMS своими руками. Кэширование"

    Нет комментариев.


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов