Кэширование страниц средствами PHP

Автор: Topol Вторник, Апрель 17th, 2012 Нет комментариев

Рубрика: Программирование

Здравствуйте дорогие коллеги и просто читатели. Если Вы решили прочитать эту статью значит Вас как и меня волнует проблема кэширования страниц и тем самым ускорение их загрузки. Многие после того как начинают изучать язык веб-программирования стремятся создать что — нибудь своё уникальное и скорее выложить для всеобщего пользования в Интернет, но большинство не заботится о функциональности своих приложений. Поэтому данная статья нацелена на помощь в увеличении функциональности ваших программ, хотя бы со стороны быстроты загрузки страниц. Из-за того что многие интернет пользователи, особенно в России выходят в Интернет через обычный модем, а скорость как Вы знаете полное г…. Загрузки страниц через модем происходит со скорость в среднем 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:
<?php
require_once(«cache_class.php»); //Подключаем класс
$new=new CACHE; //Объявляем класс
$new->cache_content();//Буферизируем контент файла
?>
<html>
<body>
<table border=1>
<tr>
<td>
Имя
</td>
<td>
Почта
</td>
<td>
Адрес
</td>
</tr>
<tr>
<td>
maksim
</td>
<td>
Maksik1@yandex.ru
</td>
<td>

http://users.oskol.ru/~dergach/

</td>
</tr>
</table>
<?php
$new->haupt_cache();
?>
Вот и всё. Удачи Вам в изучении PHP.

Источник: woweb.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты