Кэширование контента в файлы 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, обновлено 22.12.2022
1082
Следующая запись Как вывести PHP массив

Комментарии

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

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

Шорткоды на регулярных выражениях
Часто на сайтах возникает необходимость вставлять в тексты страниц динамичные информационные блоки – баннеры, телефоны...
4671
+3
Постраничный вывод и базы данных
В SQL запросах, для ограничения количества строк в результате используется инструкция LIMIT, например следующий вернёт...
11320
+3
Постраничный вывод массива
В случаях, когда нужно вывести большой PHP-массив постранично, без использования баз данных.
8575
+9
Примеры отправки AJAX JQuery
AJAX позволяет отправить и получить данные без перезагрузки страницы. Например, делать проверку форм, подгружать контент и т.д. А функции JQuery значительно упрощают работу.
212482
+33
Работа с FTP в PHP
Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.
12288
+2
Загрузка изображений с превью AJAX + PHP + MySQL
В данной статье представлена упрощенная реализация загрузки изображений с превью через AJAX с сохранением в базу данных...
21355
+19