Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
 

   Интернет технологии -> PHP -> Кэширование страниц в PHP


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

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

Из-за того что многие интернет пользователи, особенно в России выходят в Интернет через обычный модем, а скорость как Вы знаете полное г.... Загрузки страниц через модем происходит со скорость в среднем 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.

Автор: maksim
Источник: www.realcoding.net

Ссылки по теме
Чтение почты через Web-интерфейс
Полезные скрипты на PHP
PHP и формы
Почтовые функции в РНР
Отправка электронной почты с помощью PHP
 

Компьютерная документация от А до Я - Главная

 

 
Интересное в сети
 
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full


Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
 
Это интересно
 

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.