Vladimir Kolesnikov Меня зовут Владимир, я программист-фрилансер (PHP, Node.js, C/C++, Qt). Ещё занимаюсь администрированием серверов и техническим переводом. Крестиком вышивать не умею.

WP File Cache: долговременное кэширование в WordPress

 

Как известно, поддерживает два вида кэширования:

  1. Кэширование на уровне страниц;
  2. Кэширование на уровне запросов.

Кэширование на уровне страниц WordPress поддерживает, но самостоятельно не реализует, вследствие чего приходится использовать сторонние плагины (Hyper Cache, WP Super Cache и т.д.). При всех достоинствах постраничного кэширования, у него есть несколько недостатков, а именно:

  • невозможность использования динамических элементов (например, captcha, работающая по методу «изящного отсеивания спама») или виджетов, генерирующих динамический контент (например, quote of the day);
  • плагины, которые отдают комментатору статическую версию страницы (в этом был замечен Hyper Cache), вынуждают пользователя каждый раз вводить свои данные (имя, сайт, email) заново.

Кэширование на уровне запросов WordPress поддерживает и реализует самостоятельно, но в этой реализации есть один недостаток: между сессиями не сохраняется (что может привести к неприятным последствиям). Тем не менее, из-за особенностей архитектуры WordPress, без кэша WordPress работать будет очень медленно.

Очевидно, что если сохранять кэш между сессиями (что WordPress поддерживает, но самостоятельно реализовать не может), это может весьма положительно повлиять на .

Отмечу, что хотя поддержка кэширования на уровне запросов (в том виде, как она реализована сейчас) появилась в версии 2.5, в ядро WordPress были внесены изменения, позволяющие поддерживать долговременное кэширование без танцев с бубнами, только в версии 2.6.

На WordPress.org, как ни странно, плагинов, поддерживающих долговременное кэширование на уровне запросов, я не нашел. Вероятно, разработчики считают, что это экономия на спичках и разумнее будет творить что-то более глобальное (например, страничное кэширование).

Первая версия плагина родилась у меня давно — еще в июне. И лишь недавно я нашел время, чтобы привести в человеческий вид, добавить интерфейс для администратора и перевести на русский язык.

Функциональность плагина:

  • реализация долговременного кэширования на уровне запросов;
  • полная совместимость с интерфейсом класса WP_Object_Cache WordPress;
  • использование памяти под сессионный кэш для увеличения производительности;
  • сессионное кэширование часто изменяющихся объектов;
  • хранение настроек в коде плагина.

Особенности плагина:

  • возможность отключения кэширования (в том числе и встроенного в WordPress);
  • возможность отключения межсессионного кэширования;
  • возможность задания групп, не подлежащих межсессионному кэшированию (полезно только разработчикам, которые знают, о чём идёт речь);
  • плагин хранит свои настройки непосредственно в коде (в файле wp-content/object-cache.php). Это связано с проблемой курицы и яйца, а также с архитектурными особенностями WordPress: дело в том, что WordPress инициализирует кэш вызовом wp_cache_init(): при обработке данного вызова плагин должен инициализировать кэш. Если бы настройки хранились в таблице wp_options, плагин бы использовал функцию get_option(). Но функция get_option() вызывает wp_cache_get(), а wp_cache_get() не может использовать кэш, потому что он не инициализирован. В принципе, это не является проблемой; проблема заключается в том, что get_option() читает все опции из таблицы, для которых autoload установлен в 1. На практике это 90–95% таблицы. Ранее я уже писал, что WordPress в целом и get_option() в частности спроектированы так, что если кэширующий модуль не вернул данные, функция затребует их вновь и в полном объеме. Иными словами, опции будут загружены дважды (два обращения к базе данных). А это нехорошо. Поэтому настройки хранятся непосредственно в коде.

Плагин существует в четырёх локализациях: ураинской, русской, английской и белорусской. Если есть желание перевести плагин на другой язык, пишите.

Замечания по установке:

После активации плагин для хранения кэша будет использовать каталог wp-content/plugins/file-cache/cache. Поэтому перед активацией каталог должен быть доступен на запись. Каталог для хранения кэша можно изменить в настройках (для увеличения производительности имеет смысл размещать кэш на RAM-диске); каталог также должен быть доступен на запись.

Плагину при активации/сохранении настроек должен быть доступен на запись каталог wp-content: в него копируется файл object-cache.php. После того, как плагин активирован и сконфигурирован, права на запись можно убрать.

Удаление/деактивация плагина:
Для успешной деактивации каталог wp-content должен быть доступен на запись — требуется удаление файла wp-content/object-cache.php.

Для срочной деактивации плагина можно удалить или переименовать файл wp-content/object-cache.php. В этом случае WordPress будет использовать встроенные механизмы кэширования.

Download

Скачать последнюю версию плагина WP File Cache.

Список изменений

  • Версия 1.2.8:
    • Добавлена украинская локализация (спасибо Андрею К.).
  • Версия 1.2.7:
    • Добавлена белорусская локализация (спасибо Antsar);
    • Добавлена экспериментальная возможность использовать свежие данные в панели администрирования (данные будут браться из базы данных, кэш при записи будет обновляться).
  • Версия 1.2.5:
    • Кэшируемые данные больше не передаются по ссылке, что позволяет избежать случайного изменения данных в кэше;
    • Кэшируемые объекты перед помещением в кэш клонируются (из тех же соображений).
  • Версии 1.2.3–1.2.4:
    • Размещение плагина в репозитории WordPress и исправление ошибок, вызванных изменением каталога плагина. Спасибо Raveex за терпение и тестирование.
  • Версия 1.2.2:
    • Добавлена базовая совместимость с WordPress 3.0.
  • Версия 1.2.1:
    • Оптимизация кода, ускорение работы кэширующего движка;
    • Блокировка файла при записи;
    • Использование меньшего количества системных вызовов при записи файлов.
  • Версия 1.1
  • Версия 1.0
  • Версии 0.2.x

Оценки производительности

  1. «Голый» WordPress 2.7rc1:
    1. Кэширование запрещено: 191 запроса, 0.587 с
    2. Встроенный в WordPress кэш: 18 запросов, 0.350 с
    3. WP File Cache: сессионное кэширование: 18 запросов, 0.334 с
    4. WP File Cache: долговременное кэширование: 3 запроса, 0.315 с
  2. Данный сайт:
    1. Кэширование запрещено: 1442 запроса, 3.558 с
    2. Встроенный в WordPress кэш: 51 запрос, 0.776 с
    3. WP File Cache: сессионное кэширование: 51 запрос, 0.615 с
    4. WP File Cache: долговременное кэширование: 13 запросов, 0.576 с

 Опубликовано в 13:23

  322 Ответов в “WP File Cache: долговременное кэширование в WordPress”

  1. Доброго времени суток!

    Подскажите по поводу совмес тимости с версией 3.5 и нормально ли будет работать плагин в мультисайтовом режиме. Спасибо

  2. Вообще значит не так настроили forevell, на сервере произведите настройку под unix из виндовс, и перезагрузите аппач. Тогда должнно «дружить».

  3. Ваша плагин насохранял мне на хостинге аж 50 тысяч файлов кэше. Я что-то сделала не так? Как исправить ситуацию?
    Что такое файл object-cache.php? Где его брать-то? Где он находится?
    Вы пишете «для увеличения производительности имеет смысл размещать кэш на RAM-диске». Это как?

    • Ваша плагин насохранял мне на хостинге аж 50 тысяч файлов кэше. Я что-то сделала не так?

      Да нет, всё так. Это приколы либо WordPress, либо какого-то из плагинов.

      Что такое файл object-cache.php? Где его брать-то? Где он находится?

      Он находится в каталоге wp-content.

      Вы пишете “для увеличения производительности имеет смысл размещать кэш на RAM-диске”. Это как?

      У Вас VPS или shared hosting?

  4. Еще вдогонку вопрос. Как в Вашем плагине установить автоматическую чистку кэша?

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

      В Вашем случае с 50,000 файлами что-то явно не так — какой-то плагин использует кэш явно не по назначению.

      Вы можете написать, в каком из подкаталогов кэша сколько файлов?

      Ещё вопрос: у вас на хостинге есть возможность настраивать и запускать cron? Если да, то есть относительно быстрый вариант чистки старых файлов, если нет, я добавлю такую функциональность в плагин.

  5. Вы писали: «у вас на хостинге есть возможность настраивать и запускать cron? Если да, то есть относительно быстрый вариант чистки старых файлов, если нет, я добавлю такую функциональность в плагин».
    Я думаю, на хостинге этого нет, потому что ребята, работающие на хостинге просили обратиться к Вам для решения проблемы. Сказали, что в плагине не нашли настройки для удаления старых файлов.
    Кнопкой «очистить кэш» удалились все файлы из кэша (не только старые, но и новые), кроме самого необходимого набора. В результате сегодня (на следующий день после очистки кэша) и админка, и страницы сайта загружаются дольше обычного.
    Буду признательна, если добавите такую функциональность в плагин.
    С праздником!

  6. Как исключить из кеширования текстовый вывод счётчика плагина Simple Feed Stats?

  7. Спасибо за ваш плагин, сайт, труд!
    Установила плагин, благополучно забыла, потому как всё было хорошо.
    Казус случился при смене хостера.
    Долго таращилась на непонятные пути, которые перемешались от старого и нового хостинга, пока не догадалась, что дело в плагине и не нашла через гугл снова ваш сайт. Щас всё хорошо. Разобралась. Пойду добавлюсь к вам в фэйсбук, чтоб снова не потеряться.

  8. Как кеширование влияет на seo?

Leave a comment below if you dare

If by accident you see this form, please do not use it; use the form below this instead.

 Оставить комментарий

(обязательно)

(обязательно)

Вы можете использовать эти HTML теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.