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

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

Рубрика: Язык PHP

Здравствуйте дорогие коллеги и просто читатели. Если Вы решили прочитать эту статью значит Вас как и меня волнует проблема кэширования страниц и тем самым ускорение их загрузки. Многие после того как начинают изучать язык веб-программирования стремятся создать что — нибудь своё уникальное и скорее выложить для всеобщего пользования в Интернет, но большинство не заботится о функциональности своих приложений. Поэтому данная статья нацелена на помощь в увеличении функциональности ваших программ, хотя-бы со стороны быстроты загрузки страниц.

Из-за того что многие интернет пользователи, особенно в России выходят в Интернет через обычный модем, а скорость как Вы знаете полное г…. Загрузки страниц через модем происходит со скорость в среднем 4 кБ в секунду, представте если вы загружаете страницу весом 60 кБ или ещё хуже 100 кБ, то ожидать вам придёться от 15 до 25 секунд. А если сюда приплюсовать большое количество sql запросов в скрипте и возможно неоптимизированный код то….. Поэтому я предлагаю кэшировать страницы с помощью класса WebCachePage_v_1.0. Подробно описывать все функции класса я не буду, а расскажу принцип работы класса и как им пользоваться. С кодом я думаю Вы и сами разберётесь. Изначально класс создавался как дополнение к обработчику шаблонов WebTemplate_v_1.1 (в скором времени я представлю его Вам). Принцип работы класса основан на трёх стандартных функциях php:

<p><br>

<strong>ob_start()</strong> — включает буферизацию вывода данных. <br>

<strong>ob_get_contents()</strong> — возвращает содержимое буфера (можно загнать в переменную). <br>

<strong>ob_end_clean()</strong> — очищает буфер вывода и отключает буферизацию вывода. C помощью функции ob_start() — буферизируем контент файла, потом с помощью функции ob_get_contents() загоняем контент файла в переменную и наконец очищаем буфер функцией ob_end_clean(). </p>

<p>Код класса (к сожалению ссылку, чтобы его скачать дать не могу, так как нет сервера): </p>

<?php

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

?>

<p>Для того чтобы начать работу с классом Вам необходимо создать каталог для кэшируемых файлов (по умолчанию cache). Затем включить класс в файл который будет кэшироваться с помощью функций include, require, но лучше всего require_once. После всех проделанных действий в начале документа Вам необходимо объявить класс и вызвать функцию буферизации:</p>

<?php

$new=new CACHE;

$new->cache_content();

?>

<p>Далее идёт сам файл который будем кэшировать и в конце файла вызывается главная функция кэширования: </p>

<?php $new->haupt_cache(); ?>

<p>Если вы вдруг захотите отчистить весь каталог с кэшируемыми файлами для этого есть специальная функция cleaning_cache_katalog($type, $file=»"); </p>

<p> Для работы с функцией вам необходимы два параметра $type — задаёт тип отчистки каталога (all — весь каталог, file — отдельный файл). Если вдруг вы захотите удалить отдельный файл с кэшем Вам необходимо в параметре $type указать file, а в параметре $file — имя файла. Приведём пример index.php: <br>

</p>

<?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();

?>

<p><br>

Вот и всё. Удачи Вам в изучении PHP.

Автор: maksim

Источник: http://www.php.su/articles/?cat=examples&page=005

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

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

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