Самый простой способ кэширования на стороне сервера php(ob_start())

При написании небольших проектов можно сильно не беспокоиться за, то как нерационально написан скрипт с точки зрения использования процессора и баз данных, допустим если количество посетителей в день не превышает 10-20 человек в день. Но при росте количества посетителей со временем могут происходить сбои работе из за большого количества запросов хостер может просто ограничивать вам ресурсы и следовательно часть скрипта просто не будет выполнена. Мой хостер при большой загрузке блокировал запросы к базе данных и вместо текста и полей не выводилось пустое пространство. Для решения этой проблемы я проделывал работы:
1. Оптимизация кода на php
2. Укорачивание запросов, например выбор только одного поля или нескольких, где использовалось (*).
3. Раз в сутки выполнял запрос с задействованием большого количества полей и условий и записывал в отдельной таблице базы данных результат и выводил только его.
4. Задействовал в самом нагруженном месте функцию php ob_start(). О ней подробнее ниже.

Что делает ob_start()
Функция позволяет перенаправить вывод результата php скрипта в отдельную переменную:

<?php
ob_start(); Стартуем использование механизма
echo "ok"; Делаем вывод
ob_end_flush(); Эта команда выводит весь результат который был до нее и между функцией ob_start(); в виде html в тело документа.
?>

Т. е. в результате работы данного куска кода получиться результат аналогичный простому использованию одной команды echo:

<?php
echo "ok";
?>

Если в первом случае не использовать функцию ob_end_flush(); , то результат выведен не будет, а по завершению работы скрипта просто произойдет очищение буфера.

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

<?php
//Получаем значение URI(То есть часть строки адреса без домена)

if($_SERVER['REQUEST_URI']!="/")
{
//Загоняем в переменную
$request = $_SERVER['REQUEST_URI'];
//Вырезаем символ слеша
$request = urldecode(str_replace('/', '', $request));
}



Проверяем на существование файла кэша
$filename_cache = 'cache/'.$request;

if (file_exists($filename_cache))
{
//Если существует то просто выводим на экран
$handle = fopen($filename_cache, "r");
$contents_from_cache = fread($handle, filesize($filename_cache));
fclose($handle);
echo  $contents_from_cache;
}
else
{
//Если нет то исполняем скрипты с результатами, запросы к базе данных, в общем, все что //нужно.
echo "Строка которая будет записана в кэш файл на сервере";

//******************************************************//


//Открываем файл на запись в папке cache сервера(естественное ее надо создать)
$file = fopen ("cache/".$request,"w");
//Приравниваем(присваиваем) значение буфера переменной
$content_cache = ob_get_contents();
if (!$file)
{
//Проверка на всякий
echo("Ошибка открытия файла");
}
else
{
//Если файл доступен на запись пишем
fputs ( $file, $content_cache);
}
fclose ($file);
//******************************************************//

ob_end_flush(); // Просто выводим содержимое буфера
 }

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

В части скрипта где происходит чтения файла можно использовать так же оператор include, это по желанию.

При использовании в связки с ЧПУ, будет вполне симпатично выглядеть.

Комментарии

Популярные сообщения из этого блога

Две сетевые карты Windows 7. Настройка маршрутизации

Cisco Packet Tracer + Русификатор

Восстановление конфигурации Cisco с tftp сервера