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

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

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

HTML
Текст

  1.  CLASS CACHE
  2. {//Begin class
  3. //Название класса
  4. var $name="WebCachePage";
  5. //Версия класса кэширования
  6. var $version="_v_1.0";
  7. //Хэш код файла
  8. var $hash_code="";
  9. //Каталог кэширования файлов
  10. var $dir_cache="cache";
  11. //Переменная содержащая дату последнего кэширования, которую получаем в
  12. // результате вычислений
  13. var $modifi_file;
  14. //Время последней модификации
  15. //Устанавливается в секундах, по умолчанию 10 мин
  16. var $time_file_cache=600;
  17. //Хранение значения контента файла
  18. //При буферизации
  19. var $CONTENT;

  20. /*
  21. ----------------------------------------------
  22. Главная функция кэшируемых файлов
  23. ----------------------------------------------
  24. */
  25. function haupt_cache()
  26. {
  27. $this->code_file(); //Получение хэш кода файла
  28. $this->clean_content(); //Получение и отчистка буфера
  29. if($this->file_and_katalog_isset()==FALSE) $this->create_cache_file(); //Создания
  30. // файла кэша если его нет
  31. else $this->cache_file(); //Проверка последней модификации
  32. if($this->modifi_file>$this->time_file_cache) $this->mod_file_cache(); //Модифицирование
  33. // файла кэша
  34. }

  35. /*
  36. -------------------------------------------------------------------------------
  37. Функция проверки существования файла и каталога кэширования
  38. -------------------------------------------------------------------------------
  39. */
  40. function file_and_katalog_isset()
  41. {
  42. if(file_exists($this->dir_cache."/".$this->hash_code.".php")) return TRUE; //Проверяет
  43. // существование файла в каталоге кэширования
  44. else return FALSE;
  45. }

  46. /*
  47. ----------------------------------------------
  48. Функция кэширования контента файла
  49. ----------------------------------------------
  50. */
  51. function cache_content()
  52. {
  53. ob_start(); //Кэшируем контент файла
  54. }

  55. /*
  56. -------------------------------------------------------
  57. Функция преобразования url файла в хэш код
  58. -------------------------------------------------------
  59. */
  60. function code_file()
  61. {
  62. $url=$GLOBALS['REQUEST_URI']; //Получаем url файла
  63. $hashcode_file=md5($url); //Хэш код файла
  64. $this->hash_code=$hashcode_file;
  65. }

  66. /*
  67. ----------------------------------------------------------------------------------
  68. Функция создания файла кэша если его нет в каталоге кэширования
  69. ----------------------------------------------------------------------------------
  70. */
  71. function create_cache_file()
  72. {
  73. //Создаём файл с кэшем
  74. $open=fopen($this->dir_cache."/".$this->hash_code.".php", "at") or
  75. die(trigger_error("Невозможно открыть файл ".$this->hash_code.".php
  76. [".$this->name.$this->version."]", E_USER_ERROR));
  77. flock($open, LOCK_EX);//Блокируем файл
  78. rewind($open); //Установка позиции в начало файла
  79. $time_create_file=time(); //Время создания кэшируемого файла
  80. $write_file=$this->CONTENT.""; //Формируем контент файла для записи
  81. fwrite($open, $write_file); //Записываем данные
  82. fclose($open); //Закрываем файл
  83. readfile($this->dir_cache."/".$this->hash_code.".php");
  84. }

  85. /*
  86. -------------------------------------------------------------
  87. Функция проверки последнего кэширования файла
  88. -------------------------------------------------------------
  89. */
  90. function cache_file()
  91. {
  92. //Открываем файл
  93. $fopen=fopen($this->dir_cache."/".$this->hash_code.".php", "rt") or
  94. die(trigger_error("Невозможно открыть файл ".$this->hash_code.".php
  95. [".$this->name.$this->version."]", E_USER_ERROR));
  96. $fread=fread($fopen, filesize($this->dir_cache."/".$this->hash_code.".
  97. php")); //Прочитываем контент файла
  98. preg_match_all("/()/i", $fread, $time_mod); //Ишем дату последней модификации файла
  99. fclose($fopen);//Закрываем файл с кэшем
  100. $mod_file=time()-$time_mod[2][0]; //Время последнего кэширования файла
  101. $this->modifi_file=$mod_file; //Присваиваем модификацию файла переменной
  102. if($this->modifi_file< $this->time_file_cache) //Проверяем время последнего кэширования
  103. {
  104. readfile($this->dir_cache."/".$this->hash_code.".php"); //Подключаем файл
  105. }
  106. }

  107. /*
  108. ------------------------------------------------------------------------------------------
  109. Функция модификации файла если время полседнего кэширования истекло
  110. ------------------------------------------------------------------------------------------
  111. */
  112. function mod_file_cache()
  113. {
  114. //Удаляем кэшируемый файл так как время последней модификации истекло
  115. unlink($this->dir_cache."/".$this->hash_code.".php");
  116. $open=@fopen($this->dir_cache."/".$this->hash_code.".php", "at")
  117. //Открываем файл
  118. or
  119. die(trigger_error("Невозможно открыть файл ".$this->hash_code.".php
  120. [".$this->name.$this->version."]", E_USER_ERROR));
  121. flock($open, LOCK_EX);//Блокируем файл
  122. rewind($open); //Установка позиции в начало файла
  123. $time_create_file=time(); //Время создания кэшируемого файла
  124. $write_file=$this->CONTENT.""; //Формируем контент файла для записи
  125. fwrite($open, $write_file); //Записываем данные
  126. fclose($open); //Закрываем файл
  127. readfile($this->dir_cache."/".$this->hash_code.".php");
  128. }

  129. /*
  130. -------------------------------------------
  131. Функция отчистки каталога с кэшем
  132. -------------------------------------------
  133. */
  134. function cleaning_cache_katalog($type, $file="")
  135. {
  136. switch($type)
  137. {
  138. case"all":
  139. $dir=opendir($this->dir_cache); //Открываем каталог с кэшем
  140. while($delete_file=readdir($dir)) //Читаем каталог с кэшем в цикле
  141. {
  142. unlink($this->dir_cache."/".$delete_file); //Удаляем все файлы
  143. }
  144. closedir($dir);
  145. break;
  146. case"file":
  147. //Удаляем файл из каталога с кэшем
  148. if(unlink($this->dir_cache."/".$file)) echo"Файл кэша ".$file." успешно
  149. удалён из каталога";
  150. //Выводми сообщение об ошибке
  151. else trigger_error("Невозможно удалить файл с кэшем [".$this->name.$this->version."]",
  152. E_USER_ERROR);
  153. break;
  154. default:
  155. //Сообщение об ошибке
  156. trigger_error("Такой команда отсутствует [".$this->name.$this->version."]",
  157. E_USER_ERROR);
  158. break;
  159. }
  160. }

  161. /*
  162. ---------------------------------
  163. Функция получения буфера
  164. ---------------------------------
  165. */
  166. function clean_content()
  167. {
  168. $this->CONTENT=ob_get_contents(); //Записываем буфер в переменную
  169. ob_end_clean(); //Отчищаем буфер
  170. }
  171. }//End_class

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

HTML
Текст

  1.       $new=new CACHE;
  2.     $new->cache_content();  

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

HTML
Текст

  1.    $new->haupt_cache();

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

HTML
Текст

  1. cleaning_cache_katalog($type, $file="")

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

HTML
Текст

  1. < ?php
  2. require_once("cache_class.php"); //Подключаем класс
  3. $new=new CACHE; //Объявляем класс
  4. $new->cache_content(); //Буферизируем контент файла
  5. ?>
  6. < html>
  7. < body>
  8. < table border=1>
  9. < tr>
  10. < td>
  11. Имя
  12. < /td>
  13. < td>
  14. Почта
  15. < /td>
  16. < td>
  17. Адрес
  18. < /td>
  19. < /tr>
  20. < tr>
  21. < td>
  22. maksim
  23. < /td>
  24. < td>
  25. Maksik1@yandex.ru
  26. < /td>
  27. < td>
  28. http://users.oskol.ru/~dergach/
  29. < /td>
  30. < /tr>
  31. < /table>
  32. < ?php
  33. $new->haupt_cache();
  34. ?>

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



Постоянные ссылки

При копировании ссылка на TeaM RSN обязательна!

URI

Html (ЖЖ)

BB-код (Для форумов)

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

Вы должны войти, чтобы оставить комментарий.