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

Декілька слів про сам процес кешування та буферизації.
Існує багато варіантів реалізації буферів виведення. Крім користувальницького буфера є спеціальні модулі web-сервера для виконання даного завдання, плюс браузери вміють працювати з буфером.
Робота з буфером виведення в PHP завжди має розпочинатися з функції Ob_start.
Весь наступний вивід після функції Ob_start потраплятиме у буфер виводу.
Для збереження даних та обробки виводу можна скористатись функцією Ob_get_contents.
Буфер можна відправити (скинути) у браузер (ключове слово 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", але її використання небажане.
Зараз майже всі сучасні сайти використовують динамічні генерації сторінки, і можна помітити, що їхній зміст змінюється набагато рідше. Щоб заощадити ресурси та час, можна скористатися кешуванням сторінок.
Майже одним недоліком цього процесу є його старіння. Наприклад, вміст сторінки змінився, а кеш продовжує відображати старі дані. Боротися з цим можна, якщо контролювати життя кешу за часом або самостійно очищати його при редагуванні матеріалу.
Приступимо до практичної сторони цієї проблеми:
Цей код дуже швидкий, легкий, і може принести дуже велику продуктивність та швидкість вашому сайту.

Декілька слів про сам процес кешування та буферизації.
Існує багато варіантів реалізації буферів виведення. Крім користувальницького буфера є спеціальні модулі 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 секунд, тобто однієї години. Якщо умова виконується, тоді просто підключаємо файл-кеш, інакше включаємо буферизацію виводу, виводимо динамічний вміст сторінки, записуємо у файл вміст буфера, очищаємо та відключаємо буферизацію виводу з виведенням вмісту буфера користувачеві.Цей код дуже швидкий, легкий, і може принести дуже велику продуктивність та швидкість вашому сайту.
