Простой способ кэширования страниц сайта на стороне сервера

Известно, что статические сайты загружаются быстрее, чем динамические. Это связано с тем, что статический сайт представляется пользователю «как есть» в браузере, в то время как динамический сайт предварительно обрабатывается на сервере и запрашивается в базе данных. Суть кэширования на стороне сервера заключается в том, чтобы записывать все, что происходит на сервере, в файл, хранить его и передавать статическую копию, когда этот или другой пользователь обращается к этой странице позже. В результате не только ускоряется загрузка страницы, но и снижается нагрузка на сервер и базу данных. Теперь попробуем реализовать простейший метод буферизации.

Нам понадобятся функции:
file_exists() — проверяет наличие указанного файла или каталога.
readfile() — позволяет прочитать данные из файла. Т.е. эта функция будет читать наш статичный файл
ob_start() — включает буферизацию вывода. Т.е. все, что будет происходить после этой функции, будет сохранено в буфер(временное хранилище)
ob_get_contents() — получает содержимое буфера вывода.
ob_end_flush() — отправляет содержимое буфера вывода пользователю (если оно имеется), очищает его и выключает буферизацию вывода.
fopen — открывает файл или URL
fwrite() — записывает содержимое в файл.
fclose() — закрывает файл.
На сервере предварительно создадим папку, например с названием caсhe (название можно придумать любое )

Итак, приступим:
1. В самом начале нашей php — страницы пишем:

<?php
if (file_exists('cache/index_'.$_GET["page"].'_'.$_GET["id"].'.cache')){  
readfile('cache/index_'.$_GET["page"].'_'.$_GET["id"].'.cache'); exit();} 
ob_start();
// далее идет любой ваш html-php код
include("includes/bd.php");
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
и т.д. и т.п.
?>

Если у нас существует файл index_xx_yy.cache, то просто считываем содержимое файла, выводим на экран и останавливаем какие-либо дальнейшие действия на странице. Здесь xx — это значение переменной $_GET[«page»] (например номер страницы), уу — это значение переменной $_GET[«id»] (например какой-то параметр, формирующий нашу страничку). Если же нет, в папке кэш нашей статичной копии включаем буфер и записываем в него все, что происходит на странице.

 

2. В самом конце после тэга </html>:

<?php  $buffer = ob_get_contents();
ob_end_flush(); 
$fp = fopen('cache/index_'.$_GET["page"].'_'.$_GET["id"].'.cache', 'w'); 
fwrite($fp, $buffer); 
fclose($fp); 

Мы записываем в $buffer содержимое буфера, после останавливаем буферезацию и очищаем его. Затем открываем файл index_xx_yy.cache // (если его нет на сервере, то создаем, за это отвечает параметр ‘w’ у ф-ции fopen), записываем в файл $fp значение $buffer и закрываем его. Теперь у нас php — страница будет обрабатываться на сервере 1 раз с первым посетителем, а для всех последующих выводить статичный html- код.
Что будет если параметров $_GET[«page»] и $_GET[«id»] не существует?
(если загружена страница index.php без переменных $_GET). Файл index_xx_yy.cache примет вид index__.cache (после index двойная черта), что в принципе является нормальным именем файла 🙂

 

3. Теперь о том, как очистить кэш. Это необходимо когда вы добавили что-то новое на страницу или на сайт, у вас появилась новая запись в гостевой. Просто добавьте в нужном месте (например после того, как запись в гостевой была добавлена в базу данных):

unlink ('cache/index_'.$_GET["page"].'_'.$_GET["id"].'.cache');

Эта функция удалит кэш файл index_xx_yy.cache

Папка кэша должна быть доступна для записи. Это означает, что нужно определить, что кэшировать, кэшировать только те части, которые вам нужны, и создать файл с именем блока в папке кэша. Как только вы поймете этот урок, создание блочной буферизации станет не таким уж сложным делом.

  
Posted in PHP