Файловое кэширование

Статья для новичков. Самый простой и доступный способ кэширования – это кэширование на файлах. Хотя оно и самое медленное. Возьмем для примера мой блог.

Справа выводится облако тегов, которое генерируется за 0.21 сек. Это очень много для такого маленького бложика, особенно если учитывать, то вся страница генерируется за 0.23 секунды. Фактически 90% уходит на генерацию облака, которое обновляется раз в несколько суток (пишу посты я не каждый день). Вот его мы и будем кэшировать.

$filemtime = filemtime($_SERVER['DOCUMENT_ROOT'].'/cache/tags.txt');
if ((time() - $filemtime) > 60*60*24) {
    $Cloud = new SimpleTags();
    $fp = fopen($_SERVER['DOCUMENT_ROOT'].'/cache/tags.txt', 'w');
    flock($fp, LOCK_EX);
    fwrite($fp, $Cloud->extendedTagCloud());
    flock($fp, LOCK_UN);
    fclose($fp);
}
include($_SERVER['DOCUMENT_ROOT'].'/cache/tags.txt');

Файл, в котором хранится кэш
http://ekimoff.ru/cache/tags.txt

Узнаем время последнего изменения файла в формате unix_timestamp
filemtime($_SERVER['DOCUMENT_ROOT'].'/cache/tags.txt')

Если прошло больше суток (в секундах) с последнего изменения кэша
(time() - $filemtime) > 60*60*24

Генерируем облако
$Cloud = new SimpleTags();
$Cloud->extendedTagCloud()

Блокируем доступ к файлу в момент записи
flock($fp, LOCK_EX);
fwrite($fp, …);
flock($fp, LOCK_UN);

Берем данные из кэша
include($_SERVER['DOCUMENT_ROOT'].'/cache/tags.txt');

Теперь кусок кода с кэшированием выполняется за 0.0005 сек, а вся страница генерируется за 0.02 секунды вместо 0.23 сек.

Ну и пара слов об облаке. На самом деле тормозит sql-запрос с тремя джойнами, без индексов (плагин SimpleTags). Это еще раз доказывает, что оптимизация и кэширование sql-запросов – это основной путь к увеличению производительности.

#1

Если у вас дешевый хостинг то возможно это и вариант, но если же у вас нормальный сервер со всемы вытекающими из этого последствиями, то лучше использовать memcache или redis.

Арчи, 27.01.2011 - 21:51
#2

Я бы еще порекомендовал вместо инклуда использовать readfile.
Он быстрее прочитает статический файл, в отличии от include.

sergunik, 28.01.2011 - 11:43
#3

Интересные посты начал писать.
Крассавчик)

sergunik, 28.01.2011 - 11:52
#4

include()??? Совсем того?? А если тег каким то образом станет (особенно если публичный блог)

Сергей, 31.01.2011 - 02:24
#5

Предыдущий коммент сожрал парсер. Короче имею в виду что если в кеш-файле будет PHP код, то он выполнится и может наделать делов (особенно если догадаться таким образом кешировать текст статьи или комментария)

Сергей, 31.01.2011 - 02:26
#6

Да, согласен. include не вариант. Но это спасет лишь от php-инъекций. XSS будет работать даже при readfile() и др.

admin, 31.01.2011 - 10:00
#7

Добрый день.

Очень понравилась стать - и нашел наглядное объяснение того, как работать с flock($fp, LOCK_EX);

Есть еще небольшой вопросик для чего три джойна понадобилось при выборе тэгов?

--
Спасибо.

Ивано++, 26.09.2013 - 16:49
#8

таков wordpress.

admin, 26.09.2013 - 21:03
Оставить комментарий