1. Головна
  2. Колонка автора
  3. Проста система кешування та буферизації на PHP

Проста система кешування та буферизації на PHP

На даний момент зовсім не важливо, як саме здійснюється виведення динамічної інформації сайту, чи читанням з файлу або з MySQL, ми все одно організуємо переведення динаміки на статику.
Проста система кешування та буферизації на PHP
Декілька слів про сам процес кешування та буферизації.

Існує багато варіантів реалізації буферів виведення. Крім користувальницького буфера є спеціальні модулі web-сервера для виконання даного завдання, плюс браузери вміють працювати з буфером.

Робота з буфером виведення в PHP завжди має розпочинатися з функції Ob_start.
// Включаємо буфер
ob_start( );
echo 'hello world';
Функції для роботи з буфером мають префікс "ob_", що є скороченням від "output buffer".

Весь наступний вивід після функції Ob_start потраплятиме у буфер виводу.

Для збереження даних та обробки виводу можна скористатись функцією Ob_get_contents.
ob_start();
echo 'hello world';
$buffer = ob_get_contents();
Після збереження даних можна очистити та вимкнути буфер. Для цього існує функція Ob_end_clean.
ob_start();
echo 'hello world';
$buffer = ob_get_contents();
ob_end_clean();
Якщо виведення не було здійснено користувачем, тоді PHP самостійно виконає "скидання" буфера виводу в браузер користувача.

Буфер можна відправити (скинути) у браузер (ключове слово flush), очистити (clean) або вимкнути (end).

Ob_clean - очищаємо буфер виводу;

Ob_flush - надсилаємо буфер виведення;

Ob_end_clean - буфер виводу відключаємо та очищаємо;

Ob_end_flush - буфер виводу відключаємо та відправляємо в браузер;

Ob_get_clean - отримуємо буфер виводу, очищаємо та відключаємо;

Ob_get_flush - відправляємо буфер виведення, очищаємо та відключаємо;

Операції над буфером визначаються параметром $flags за виклику функції Ob_start.

Якщо ви бажаєте створити обгортку над усім кодом, можна включити директиву Output_buffering. Ця директива допоможе уникнути помилок виду "headers already sent", але її використання небажане.

Зараз майже всі сучасні сайти використовують динамічні генерації сторінки, і можна помітити, що їхній зміст змінюється набагато рідше. Щоб заощадити ресурси та час, можна скористатися кешуванням сторінок.

Майже одним недоліком цього процесу є його старіння. Наприклад, вміст сторінки змінився, а кеш продовжує відображати старі дані. Боротися з цим можна, якщо контролювати життя кешу за часом або самостійно очищати його при редагуванні матеріалу.

Приступимо до практичної сторони цієї проблеми:
// Отримуємо ім'я файлу з URL за допомогою шифрування md5
$cache_file = $_SERVER['DOCUMENT_ROOT'].'/cache/'.md5($_SERVER['REQUEST_URI']).'.tmp';
// Якщо файл кешу існує і оновлювався менш ніж годину тому, підключаємо його
if (file_exists($cache_file) && (time() - filemtime($cache_file)) < 3600) {
exit(include($cache_file));
} else {
// Включаємо буферизацію виведення
ob_start();
// Тут має бути згенерована сторінка
echo 'text text text';

// Зберігаємо вміст сторінки в кеш-файл
$fopendb = fopen($cache_file, 'w+');
flock($fopendb, LOCK_EX);
fwrite($fopendb, ob_get_contents());
flock($fopendb, LOCK_UN);
fclose($fopendb);
ob_end_flush();
}
Спочатку скрипт перевіряє, чи існує файл із кешем, і якщо існує, то робить ще перевірку на вік файлу в 3600 секунд, тобто однієї години. Якщо умова виконується, тоді просто підключаємо файл-кеш, інакше включаємо буферизацію виводу, виводимо динамічний вміст сторінки, записуємо у файл вміст буфера, очищаємо та відключаємо буферизацію виводу з виведенням вмісту буфера користувачеві.

Цей код дуже швидкий, легкий, і може принести дуже велику продуктивність та швидкість вашому сайту.
Редакція «КовельPost» може не поділяти думку блогерів або дописувачів. За зміст публікацій і їх достовірність відповідальність несуть автори.

Коментарі

Підписуйтесь на наш канал у Telegram! 🚀

@kovelpost