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

Статус
В этой теме нельзя размещать новые ответы.

afonya09

Полезный
Регистрация
31 Янв 2009
Сообщения
260
Реакции
19
Как сделать кеширование страниц на лету чтобы пре первом посещении создавалася файл и при следующем заходе грузился именно он??
 
алгоритм простой
если нету файла $imiya-fayla то генерим его и потом выводим. если есть то сразу выводим. при изменении страницы генерим и перезаписываем файл $imiya-fayla
 
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
Для того чтобы начать работу с классом Вам необходимо создать каталог для кэшируемых файлов (по умолчанию cache). Затем включить класс в файл который будет кэшироваться с помощью функций include, require, но лучше всего require_once. После всех проделанных действий в начале документа Вам необходимо объявить класс и вызвать функцию буферизации:

$new=new CACHE;
$new->cache_content();

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

HTML:
$new->haupt_cache();

Если вы вдруг захотите отчистить весь каталог с кэшируемыми файлами для этого есть специальная функция

HTML:
cleaning_cache_katalog($type, $file="")

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

пример index.php:

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();
?>
 
В домашней директории создаем файлы .htaccess, start_cache.php, end_cache.php, а также папку с названием cache_files.

Папке cache_files необходимо проставить атрибуты 777.

Внутри .htaccess файла пропишите следующие строки:

Код:
php_value auto_prepend_file /home/username/public_html/start_cache.php
php_value auto_append_file /home/username/public_html/end_cache.php
Строку /home/username/public_html/ необходимо заменить на путь к вашей домашней директории.

В скрипт start_cache.php помещаем следующий код:

PHP:
<?php 
// раздел настроек, которые вы можете менять 
$settings_cachedir = '/home/username/public_html/cache_files/'; 
$settings_cachetime = 3600; //время жизни кэша (1 час) 

// код 
$thispage = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
$cachelink = $settings_cachedir.md5($thispage).".html"; 
if (file_exists($cachelink)) { 
    $cachelink_time = filemtime($cachelink); 

    if ((time() - $settings_cachetime) < $cachelink_time) { 
        readfile($cachelink);die(); 
    } 
} 

ob_start(); 
?>
Не забывайте исправлять путь /home/username/public_html/ на путь к вашей домашней директории.

А следующий код поместите в скрипт end_cache.php:

PHP:
 <?php 
$fp = fopen($cachelink, 'w'); 
fwrite($fp, ob_get_contents()); 
fclose($fp); 
ob_end_flush(); 
?>
…вот, собственно, и все. Все ваши страницы будут кэшироваться на 3600 секунд. Этот параметр вы легко можете поменять в скрипте start_cache.php. Кэш страниц будет сохранен в папке cache_files. Файл start_cache.php инклудим в начале страницы а end_cache.php в конце страницы
 
Что то первый вариант если пытаюсь встроить в CMS создает пустые файлы
Второй вариант в обще страница браузером не открывается

Страница, которую вы пытаетесь просмотреть, не может быть показана, так как она использует неверную или неподдерживаемую форму компрессии.
 
Как бы сделать по последнему примеру чтобы не все запросы кешировались точнее страницы чтобы скажем папка аях не кешировалась вообще??

Добавлено через 12 минут
Или еще лучше кешировать только те страницы которые я хочу и на разное время.
Как??
 
Как бы сделать по последнему примеру чтобы не все запросы кешировались точнее страницы чтобы скажем папка аях не кешировалась вообще??

Добавлено через 12 минут
Или еще лучше кешировать только те страницы которые я хочу и на разное время.
Как??
Кэшировать целые страницы- не очень умная идея. Кэш надо делать отдельно, каждый модуль - это даст намного больше возможностей.
Хорошие классы по работе с кэшом Для просмотра ссылки Войди или Зарегистрируйся
 
Чет ссылка стремная не переходит!!!
 
Чет ссылка стремная не переходит!!!
Облагороженная ссылка:

А вообще надо смотреть на необходимость кэширования. Как часто запрашивается страница, как часто она изменяется и как долго она гененируется?

Я использовал способ аналогичный описанному prepend/append для парсера хитрых логов, чтобы парсер каждый раз не мучился, пока не упали новые логи - результат брался из кэша.
 
Ничего не понял с ссылки!!!
Видимо придеца писать самому...:yahoo:
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху