Здравствуйте дорогие коллеги и просто читатели. Если Вы решили прочитать эту статью значит Вас как и меня волнует проблема
кэширования страниц и тем самым ускорение их загрузки.
Многие после того как начинают изучать язык веб-программирования стремятся создать что - нибудь своё уникальное и скорее выложить для всеобщего пользования в Интернет, но большинство не заботится о функциональности своих приложений. Поэтому данная статья нацелена на помощь в увеличении функциональности ваших программ, хотя бы со стороны быстроты загрузки страниц.
Из-за того что многие интернет пользователи, особенно в России выходят в Интернет через обычный модем, а скорость как Вы знаете полное г.... Загрузки страниц через модем происходит со скорость в среднем 4 кБ в секунду, представте если вы загружаете страницу весом 60 кБ или ещё хуже 100 кБ, то ожидать вам придёться от 15 до 25 секунд. А если сюда приплюсовать большое количество sql запросов в скрипте и возможно неоптимизированный код то.....
Поэтому я предлагаю кэшировать страницы с помощью класса WebCachePage_v_1.0. Подробно описывать все функции класса я не буду, а расскажу принцип работы класса и как им пользоваться. С кодом я думаю Вы и сами разберётесь.
Изначально класс создавался как дополнение к обработчику шаблонов WebTemplate_v_1.1 (в скором времени я представлю его Вам). Принцип работы класса основан на трёх стандартных функциях php:
ob_start() - включает буферизацию вывода данных.
ob_get_contents() - возвращает содержимое буфера (можно загнать в переменную).
ob_end_clean() - очищает буфер вывода и отключает буферизацию вывода.
C помощью функции ob_start() - буферизируем контент файла, потом с помощью функции ob_get_contents() загоняем контент файла в переменную и наконец очищаем буфер функцией ob_end_clean(). Код класса (к сожалению ссылку, чтобы его скачать дать не могу, так как нет сервера):
CLASS CACHE
{//Begin class
//Название класса
var $name="WebCachePage";
//Версия класса кэширования
var $version="_v_1.0";
//Хэш код файла
var $hash_code="";
//Каталог кэширования файлов
var $dir_cache="cache";
//Переменная содержащая дату последнего кэширования, которую получаем в результате вычислений
var $modifi_file;
//Время последней модификации
//Устанавливается в секундах, по умолчанию 10 мин
var $time_file_cache=600;
//Хранение значения контента файла
//При буферизации
var $CONTENT;
/*
----------------------------------------------
Главная функция кэшируемых файлов
----------------------------------------------
*/
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();
//Модифицирование файла кэша}
/*
-------------------------------------------------------------------------------
Функция проверки существования файла и каталога кэширования
-------------------------------------------------------------------------------
*/
function file_and_katalog_isset()
{
if(file_exists($this->dir_cache."/".$this->hash_code.".php")) return TRUE;
//Проверяет существование файла в каталоге кэшированияelse return FALSE;
}
/*
----------------------------------------------
Функция кэширования контента файла
----------------------------------------------
*/function cache_content()
{
ob_start();
//Кэшируем контент файла}
/*
-------------------------------------------------------
Функция преобразования url файла в хэш код
-------------------------------------------------------
*/function code_file()
{
$url=$GLOBALS['REQUEST_URI'];
//Получаем url файла$hashcode_file=md5($url);
//Хэш код файла$this->hash_code=$hashcode_file;
}
/*
----------------------------------------------------------------------------------
Функция создания файла кэша если его нет в каталоге кэширования
----------------------------------------------------------------------------------
*/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");
}
/*
-------------------------------------------------------------
Функция проверки последнего кэширования файла
-------------------------------------------------------------
*/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"));
//Прочитываем контент файлаpreg_match_all("/()/i", $fread, $time_mod);
//Ишем дату последней модификации файлаfclose($fopen);
//Закрываем файл с кэшем$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");
//Подключаем файл}
}
/*
------------------------------------------------------------------------------------------
Функция модификации файла если время полседнего кэширования истекло
------------------------------------------------------------------------------------------
*/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);
//Установка позиции в начало файла$time_create_file=time();
//Время создания кэшируемого файла$write_file=$this->CONTENT."";
//Формируем контент файла для записиfwrite($open, $write_file);
//Записываем данныеfclose($open);
//Закрываем файлreadfile($this->dir_cache."/".$this->hash_code.".php");
}
/*
-------------------------------------------
Функция отчистки каталога с кэшем
-------------------------------------------
*/function cleaning_cache_katalog($type, $file="")
{
switch($type)
{
case"all":
$dir=opendir($this->dir_cache);
//Открываем каталог с кэшемwhile($delete_file=readdir($dir))
//Читаем каталог с кэшем в цикле{
unlink($this->dir_cache."/".$delete_file);
//Удаляем все файлы}
closedir($dir);
break;
case"file":
if(unlink($this->dir_cache."/".$file)) echo"Файл кэша ".$file." успешно удалён из каталога";
//Удаляем файл из каталога с кэшемelse trigger_error("Невозможно удалить файл с кэшем [".$this->name.$this->version."]", E_USER_ERROR);
//Выводми сообщение об ошибкеbreak;
default:
trigger_error("Такой команда отсутствует [".$this->name.$this->version."]", E_USER_ERROR);
//Сообщение об ошибкеbreak;
}
}
/*
---------------------------------
Функция получения буфера
---------------------------------
*/function clean_content()
{
$this->CONTENT=ob_get_contents();
//Записываем буфер в переменнуюob_end_clean();
//Отчищаем буфер}
}
//End_class
Для того чтобы начать работу с классом Вам необходимо создать каталог для кэшируемых файлов (по умолчанию cache). Затем включить класс в файл который будет кэшироваться с помощью функций include, require, но лучше всего require_once. После всех проделанных действий в начале документа Вам необходимо объявить класс и вызвать функцию буферизации:
$new=new CACHE;
$new->cache_content(); Далее идёт сам файл который будем кэшировать и в конце файла вызывается главная функция кэширования:
$new->haupt_cache();
Если вы вдруг захотите отчистить весь каталог с кэшируемыми файлами для этого есть специальная функция
cleaning_cache_katalog($type, $file=""). Для работы с функцией вам необходимы два параметра $type - задаёт тип отчистки каталога (all - весь каталог, file - отдельный файл). Если вдруг вы захотите удалить отдельный файл с кэшем Вам необходимо в параметре $type указать file, а в параметре $file - имя файла.
Приведём пример index.php:
require_once("cache_class.php"); //Подключаем класс
$new=new CACHE; //Объявляем класс
$new->cache_content();//Буферизируем контент файла
?>
Имя
|
Почта
|
Адрес
|
maksim
|
Maksik1@yandex.ru
|
http://users.oskol.ru/~dergach/
|
$new->haupt_cache();
?>
Вот и всё. Удачи Вам в изучении PHP.