Самый простой способ кэширования на стороне сервера 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, это по желанию.
При использовании в связки с ЧПУ, будет вполне симпатично выглядеть.
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, это по желанию.
При использовании в связки с ЧПУ, будет вполне симпатично выглядеть.
Комментарии
Отправить комментарий