Кэширование контента в файлы PHP

Кэширование контента в файлы PHP

Для ускорения работы PHP-сайта можно применить механизм единоразового сохранения сформированного контента в файлах кэша для их повторного использования, например меню сайта, «тяжелый» вывод выгрузки из базы данных и т.д.

Для этих целей был написан небольшой статический PHP-класс для кэширования блоков контента или страниц целиком основанный на буферизации вывода в переменную.

Код файла cache.php

<?php
class Cache
{
	public static  $enable = true;
	public static  $path = '/cache';
	private static $keys = array();

	/**
	 * Получение данных из кэша.
	 */
	public static function get($name) 
	{
		if (self::$enable) {
			$file = __DIR__ . self::$path . '/' . $name . '.tmp';
			if (file_exists($file)) {
				return file_get_contents($file);
			} else {
				self::$keys[] = $name;
				return false;
			}				
		} else {
			return '';
		}
	}

	/**
	 * Отправка данных в кэш.
	 */
	public static function set($content) 
	{
		if (self::$enable) {
			$name = array_pop(self::$keys);
			$dir  = __DIR__ . self::$path . '/';
			if (!is_dir($dir)) {
				@mkdir($dir, 0777, true);
			}
			file_put_contents($dir . '/' . $name . '.tmp', $content);
		} 

		return $content;
	}

	/**
	 * Начало кэширования фрагмента.
	 */
	public static function begin($name) 
	{
		if ($content = self::get($name)) {
			echo $content;
			return false;
		} else {
			ob_start();
			return true;
		}
	}
	
	/**
	 * Завершение кэширования фрагмента.
	 */
	public static function end() 
	{
		echo self::set(ob_get_clean());
	}
	
	/**
	 * Очистка кэша.
	 */
	public static function clear() 
	{
		$dir = __DIR__ . self::$path;
		foreach (glob($dir . '/*') as $file) {
			if (is_file($file)) {
				unlink($file);
			}
		}
	}
}
PHP

Использование

// Подключаем файл класса
require_once '/cache.php';

// Кэшируем фрагмент кода
if (Cache::begin('test')) {
	?>
	
	<!-- ------------------------ -->
	<!-- "Тяжелый" вывод контента -->
	<!-- ------------------------ -->
	
	<?php
	Cache::end();
}
PHP

Теперь, если в папке cache нет файла test.tmp, то условие выполнится, контент выведется и сохранится в файле. В другом случаи контент всегда будет выводится из файла кэша.

	
	<!-- ------------------------ -->
	<!-- "Тяжелый" вывод контента -->
	<!-- ------------------------ -->
	
	
TEXT

Чтобы очистить весь кэш, предусмотрен метод clear.

Cache::clear();
PHP
09.09.2022
195
Следующая запись Как вывести PHP массив

Комментарии

, чтобы добавить комментарий.

Другие публикации

Шорткоды на регулярных выражениях
Часто на сайтах возникает необходимость вставлять в тексты страниц динамичные информационные блоки – баннеры, телефоны...
4335
+3
Постраничный вывод и базы данных
В SQL запросах, для ограничения количества строк в результате используется инструкция LIMIT, например следующий вернёт...
9726
+2
Постраничный вывод массива
В случаях, когда нужно вывести большой PHP-массив постранично, без использования баз данных.
7774
+7
Определение мобильного устройства в PHP
Определить телефон или планшет можно с помощью библиотеки PHP Mobile Detect. Это легкий класс использующий строку...
16205
-1
Очистка данных из форм в PHP
Для предотвращения XSS, SQL-инъекций и других атак, данные полученные из форм нужно чистить. Простое экранирования кавычек не достаточно, нужен комплексный подход по типу данных.
8333
+5
Автоматическое сжатие и оптимизация картинок на сайте
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
19295
+8