Здравствуйте дорогие коллеги и просто читатели. Если Вы решили прочитать эту статью значит Вас как и меня волнует проблема кэширования страниц и тем самым ускорение их загрузки. Многие после того как начинают изучать язык веб-программирования стремятся создать что - нибудь своё уникальное и скорее выложить для всеобщего пользования в Интернет, но большинство не заботится о функциональности своих приложений. Поэтому данная статья нацелена на помощь в увеличении функциональности ваших программ, хотя-бы со стороны быстроты загрузки страниц.
Из-за того что многие интернет пользователи, особенно в России выходят в Интернет через обычный модем, а скорость как Вы знаете полное г.... Загрузки страниц через модем происходит со скорость в среднем 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
Постоянные ссылки
При копировании ссылка на TeaM RSN обязательна!
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.