Простейшее кеширование страниц на PHP

Опубликовано: 10-02-2014 15:15

Иногда, при разработке веб-приложений, разработчик сталкивается с ситуацией, когда страницы в его проекте грузятся/генерируются слишком медленно даже после рефакторинга. В такой ситуации можно попробовать применить кеширование страниц. Как пример, приведу такой вот простейший класс, написанный для движка сайта-визитки:


class Cache {

	private static $_cacheDir = "cached/";	//	directory with cached pages
	private static $_cacheLifeTime = 600;	//	lifetime of page in seconds

	/**
	 * Read data from cache if it possible
	 */
	public static function read() {
		$filename = self::_getFilename();
		if (file_exists($filename)) {
			if ((time() - self::$_cacheLifeTime) < filemtime($filename)) {
				die (file_get_contents($filename));
			}
		}
		ob_start();
	}

	/**
	 * Write data into cache
	 */
	public static function write() {
		$handle = fopen(addslashes(self::_getFilename()), "w");
		fwrite($handle, ob_get_contents());
		fclose($handle);
		ob_end_flush();
	}

	/**
	 * create filename for cached file
	 * @return type
	 */
	private static function _getFilename() {
		return self::$_cacheDir.basename($_SERVER["SCRIPT_NAME"]).".html";
	}
}

И сразу приведу пример его использования на практике:


include_once 'includes/cache.class.php';
Cache::read();
//	Генерирование страницы
//	...
Cache::write();

Поясню принцип его работы. Данный класс является для простоты статическим. Статический метод Cache::read() предназначен для чтения из кеша (в нем мы проверяем, есть ли данная страница в кеше, не устарела ли она (время жизни страницы в кеше задается статическим свойством $_cacheLifeTime) и если все хорошо - выводим ее в браузер. В противном же случае, открывает буфер для вывода (ob_start()) и помещаем туда всю выводимую в поток информацию), статический метод Cache::write() - для записи кеша (в нем мы создаем файл кеша страницы, если он еще не создан, либо открываем его, обнуляем содержимое, помещаем в него содержимое буфера вывода и выводим буфер в браузер).

Применяя этот класс, можно добиться неплохого прироста производительности Вашего веб-приложения. Только необходимо помнить, что на время жизни кеша, пользователю сайта будет недоступна обновленная страница. Поэтому значение времени жизни страниц в кеше нужно подбирать в каждом конкретном случаев зависимости от того, насколько часто страницы веб-приложения будут обновляться