Реализация кэширования на PHP
![Реализация кэширования на PHP](/images/articles/php-create-cache.jpg)
Когда Вы делаете проект, который обладает достаточно проблемными страницами в плане скорости их загрузки, то надо проводить рефакторинг. Но бывают случаи, когда Вы всё написали идеально, однако, скорость оставляет желать лучшего. В таких случаях поможет кэширование страниц. Поэтому я решил написать статью о реализации кэширования на PHP.
Прежде чем показывать код, Вы должны заранее осознать алгоритм. Кэширование - это просто сохранение сгенерированной страницы в отдельный файл. То есть получили HTML-код страницы и сохранили его в отдельный файл. Затем при следующем обращении к скрипту заново страница не генерируется, а берётся HTML-код из этого файла. Разумеется, если при генерации речь может идти даже о десятках секунд (бывает и такое), то здесь речь идёт о сотых долях секунды. Разница очевидна.
Теперь сам код. Вам нужно создать 2 специальных файла. Первый файл будет заниматься выводом кэша, а второй - созданием кэша.
Начнём с первого файла, который назовём read_cache.php:
<?php
$cache_time = 300; // Время жизни кэша в секундах
$file = strrchr($_SERVER["SCRIPT_NAME"], "/");// Получаем название файла
$file = substr($file, 1); // Удаляем слеш
$cache_file = "/cache/$file.html"; // Файл будет находиться, например, в /cache/a.php.html
if (file_exists($cache_file)) {
// Если файл с кэшем существует
if ((time() - $cache_time) < filemtime($cache_file)) {
// Если его время жизни ещё не прошло
echo file_get_contents($cache_file); // Выводим содержимое файла
exit; // Завершаем скрипт, чтобы сэкономить время на дальнейшей обработке
}
}
ob_start(); // Открываем буфер для вывода, если кэша нет, или он устарел
?>
В данном скрипте мы получаем имя файла, затем проверяем существует ли такой кэш и не устарел ли он, а затем либо выводим его и заканчиваем работу, либо открываем буфер, куда будем помещать всю выходную информацию скрипта.
Теперь создадим файл write_cache.php, который будет заниматься записью в файл того, что у нас накопилось в буфере:
<?php
$handle = fopen($cache_file, 'w'); // Открываем файл для записи и стираем его содержимое
fwrite($handle, ob_get_contents()); // Сохраняем всё содержимое буфера в файл
fclose($handle); // Закрываем файл
ob_end_flush(); // Выводим страницу в браузере
?>
И теперь в любом PHP-файле на сайте, отвечающем за вывод страницы, можно включить кэширование следующим образом:
<?php
require_once "read_cache.php"; // Пытаемся вывести содержимое кэша
// Здесь идёт обычная генерация страницы
require_once "write_cache.php"; // Здесь идёт сохранение сгенерированной страницы в кэш
?>
Таким образом, теперь Вы можете все свои проблемные страницы начать кэшировать. Но не забывайте, что пока кэш живёт, любые обновления пользователь видеть не будет. Поэтому делайте кэширование на PHP только для тех страниц, которые редко обновляются.
-
-
Михаил Русаков
Комментарии (18):
Я пробовал такое сделать но получилось криво...Когда пользователь входит на сайт то через секунд 30 появляються опять инпуты для входа, и пишется типа он вошёл "Здравствуйте, Admin"...я так понимаю что такое нужно делать только для крупных проектов...???
Ответить
Да, это только если сервер не успевает всё быстро обрабатывать.
Ответить
Понятно...
Ответить
можно например кэшировать куски страниц, как это реализовано в yii. так же поможет apc или eAccelerator
Ответить
Здравствуйте! А как сделать кэширование для страниц типа example.com/index.php?s=7
Ответить
Аналогично, только названия файлов нужно будет разные делать, например, file-7.html.
Ответить
Как быть с кэшированием, для вывода товаров в интернет магазине, если нужно проверять дополнительно на наличие товара в корзине???
Ответить
Такие страницы либо вообще не кэшируются, либо кэшируются на несколько минут.
Ответить
Ну кэшировать хоть даже на несколько минут страницу с $_Session вобще нет. Может есть какое-то решение? Например не проверять на наличие в корзине - это выход?
Ответить
Единственное решение - не кэшировать данную страницу вообще.
Ответить
Нет не страницу. Блок где выводятся товары со своими переменными, просто не проверять добавил ли посетитель товар или нет. Ведь такой блок всегда (почти всегда) имеет одни и те же значения
Ответить
Блок кэшируется так же как и страница. В отдельный файл сохраняется, а потом просто подгружается контент из этого блока и выводится на страницу. В результате, блок не меняется.
Ответить
Так это актуально?
Ответить
Если эта операция создания блока выполняется заметно дольше, чем просто вывод из файла, то актуально.
Ответить
Как можно очистить кэши с помощью php?
Ответить
если можно хотелось бы немного деталей скажите папка cache нужна? созданные файлы где разместить?
Ответить
Выходит такая ошибка Warning: fopen(/cache/download.php.html): failed to open stream: No such file or directory in /home/admin/web/site.com/public_html/write_cache.php on line 2 Warning: fwrite() expects parameter 1 to be resource, boolean given in /home/admin/web/site.com/public_html/write_cache.php on line 3 Warning: fclose() expects parameter 1 to be resource, boolean given in /home/admin/web/site.com/public_html/write_cache.php on line 4
Ответить
Здравствуйте !!! Если показывает такие строки с чем это связанно ? Warning: fopen(/cache/nastroika_to_vihod_stranu.html.html): failed to open stream: Нет такого файла или каталога in /home/h812299477/домен.ru/docs/cache/write_cache.php on line 2 Warning: fwrite() expects parameter 1 to be resource, boolean given in /home/h812299477/домен.ru/docs/cache/write_cache.php on line 3 Warning: fclose() expects parameter 1 to be resource, boolean given in /home/h812299477/домен.ru/docs/cache/write_cache.php on line 4
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.