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

Тема в разделе "PHP", создана пользователем afonya09, 20 апр 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. afonya09

    afonya09

    Регистр.:
    31 янв 2009
    Сообщения:
    260
    Симпатии:
    18
    Как сделать кеширование страниц на лету чтобы пре первом посещении создавалася файл и при следующем заходе грузился именно он??
     
  2. Igor123

    Igor123 Постоялец

    Регистр.:
    14 июн 2008
    Сообщения:
    116
    Симпатии:
    13
    алгоритм простой
    если нету файла $imiya-fayla то генерим его и потом выводим. если есть то сразу выводим. при изменении страницы генерим и перезаписываем файл $imiya-fayla
     
  3. alexzander69

    alexzander69 Постоялец

    Регистр.:
    27 май 2008
    Сообщения:
    95
    Симпатии:
    46
    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($openLOCK_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($fopenfilesize($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($openLOCK_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();
    ?>
     
  4. Zircool

    Zircool Создатель

    Регистр.:
    1 июн 2008
    Сообщения:
    35
    Симпатии:
    43
    В домашней директории создаем файлы .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($fpob_get_contents()); 
    fclose($fp); 
    ob_end_flush(); 
    ?> 
    …вот, собственно, и все. Все ваши страницы будут кэшироваться на 3600 секунд. Этот параметр вы легко можете поменять в скрипте start_cache.php. Кэш страниц будет сохранен в папке cache_files. Файл start_cache.php инклудим в начале страницы а end_cache.php в конце страницы
     
  5. avgaz

    avgaz

    Регистр.:
    18 окт 2006
    Сообщения:
    188
    Симпатии:
    6
    Что то первый вариант если пытаюсь встроить в CMS создает пустые файлы
    Второй вариант в обще страница браузером не открывается

     
  6. afonya09

    afonya09

    Регистр.:
    31 янв 2009
    Сообщения:
    260
    Симпатии:
    18
    Как бы сделать по последнему примеру чтобы не все запросы кешировались точнее страницы чтобы скажем папка аях не кешировалась вообще??

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

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    Кэшировать целые страницы- не очень умная идея. Кэш надо делать отдельно, каждый модуль - это даст намного больше возможностей.
    Хорошие классы по работе с кэшом Перейти по ссылке
     
  8. afonya09

    afonya09

    Регистр.:
    31 янв 2009
    Сообщения:
    260
    Симпатии:
    18
    Чет ссылка стремная не переходит!!!
     
  9. Darkmind

    Darkmind SNMP maniac

    Регистр.:
    31 май 2006
    Сообщения:
    184
    Симпатии:
    76
    Облагороженная ссылка: Перейти по ссылке

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

    Я использовал способ аналогичный описанному prepend/append для парсера хитрых логов, чтобы парсер каждый раз не мучился, пока не упали новые логи - результат брался из кэша.
     
  10. afonya09

    afonya09

    Регистр.:
    31 янв 2009
    Сообщения:
    260
    Симпатии:
    18
    Ничего не понял с ссылки!!!
    Видимо придеца писать самому...:yahoo:
     
Статус темы:
Закрыта.