WP File Cache: замена WP_Object_Cache с поддержкой долговременного кэширования

Увеличиваем производительность WordPress подручными методами

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

← Вернуться к полной версии записи «WP File Cache: замена WP_Object_Cache с поддержкой долговременного кэширования»…

Вложения:

Автор: ; опубликовано в: Плагины WordPress; метки: MySQL, WordPress, WP File Cache, кэш, плагин, производительность
12
Июн
2008

RSS Комментарии к статье «WP File Cache: замена WP_Object_Cache с поддержкой долговременного кэширования» (16)

  1. Из недостатков: если WordPress/плагины забывают обновлять кэш (полагаясь на то, что кэш будет сброшен, когда скрипт завершится), могут отдаваться устаревшие данные (я это заметил в админке: черновиков статей не было, но WP писал, что есть один черновик). Буду пытаться найти решение.

    • а я то думал что за фигня была в версии 2.7 в дашборде где показывает статистику краткую – там показывало мне что 1комент в спаме, но при этом _очередь спама пуста_ (речь идет про самую новую версию плагина)

      • Начиная с версии 2.7 WordPress, счетчики не кэшируются.

        В wp-settings.php есть строка

        [-]
        View Code PHP
        wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' ));

        Поэтому плагин не должен сохранять эти данные. В каталоге с кэшем не должно быть подкаталогов comment, counts, plugins.

        Очень интересно.

  2. С другой стороны, с пользовательским интерфейсом вроде все в порядке и данные отображаются нормально :-)

  3. roose

    Если я скажу глупость, то коммент не одобряйте :-) , а если нет то отредактируете. Недавно тоже задумался над этим вопросом и прописав в wp-config строчку define('ENABLE_CACHE', true); добился уменьшения запросов на 50%.

  4. Мне grep -R "ENABLE_CACHE" * ничего не вернул, возможно, что всё дело в разных версиях.

    В 2.5.x так (вся управляющая логика находится в wp-settings.php):

    1. Если определена константа WP_CACHE, то подключается файл wp-content/advanced-cache.php. Плагины тпа HyperCache используют этот файл для того, чтобы отдавать статический кэшированый контент — к БД никаких лишних запросов благодаря тому, что все необходимые данные живут в кэше;
    2. Если существует файл wp-content/object-cache.php, то WordPress использует его вместо своего wp-includes/cache.php. wp-content/object-cache.php должен поддерживать стандартный ВордПрессовский интерфейс для работы с кэшем. В частности, WP File Cache работает именно по этому принципу.
  5. roose

    Мне grep -R «ENABLE_CACHE» * ничего не вернул, возможно, что всё дело в разных версиях.

    вот, вот потому что, файл cache.php в 2.5.х не более чем заглушка, он не проверяет существование константы ENABLE_CACHE. Вы сравните cache.php от 2.5.х и 2.3.3
    Но 2.5.х можно обмануть: Удаляем cache.php из 2.5.х, берем cache.php от 2.3.3 и вставляем его вместо удаленного и устанавливаем ENABLE_CACHE true.

    Пример применения(на localhost): Главная страница блога – 3 поста, до замены файлов – 15 запросов после замены – 4 запроса

  6. Вы сравните cache.php от 2.5.х и 2.3.3

    Сравнил, diff приаттачен.

    файл cache.php в 2.5.х не более чем заглушка

    На самом деле нет – в ветке 2.5.x кэширование полностью переписано. И реализовано иначе. Если вкратце, то в 2.5 кэш разрешен по умолчанию, и запретить его не так-то просто (фактически, нужно писать свой плагин, который будет игнорировать запросы на кэширование).

    Если есть желание попробовать 2.5 с отключенным кэшем, то нужно внести небольшую поправку в файл wp-includes/cache.php:

    [-]
    View Code PHP
    1.     function get($id, $group = 'default') { /*
    2.         if (empty ($group))
    3.             $group = 'default';
    4.  
    5.         if (isset ($this->cache[$group][$id])) {
    6.             $this->cache_hits += 1;
    7.             return $this->cache[$group][$id];
    8.         }
    9.  
    10.         if ( isset ($this->non_existant_objects[$group][$id]) )
    11.             return false;
    12.  
    13.         $this->non_existant_objects[$group][$id] = true;
    14.         $this->cache_misses += 1; */
    15.         return false;
    16.     }

    Но это будет очень жестоко :-)

    cache.diff

  7. roose

    Если кеш по умолчанию в 2.5.x включен, то почему не видно его работы, ни уменьшения кол-ва запросов, ни папки с кешируемыми данными?

  8. ни папки с кешируемыми данными

    Потому что TTL кэша — один запрос (в смысле, HTTP request): то есть скрипт закончил работу, кэш сбросился. Как следствие, все кэшированые данные живут в памяти.

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

    Потом 2.5 написан довольно-таки своеобразно: если не кэшировать данные из файла в память (двойное кэширование), то производительность падает.

    то почему не видно его работы, ни уменьшения кол-ва запросов

    Я использовал плагин SqlMon для тестирования. Результаты сейчас выложу в статью, так будет нагляднее.

  9. roose

    Спасибо за объяснения, приятно было с Вами побеседовать :-)

  10. Появилась версия 0.2 плагина WP File Cache.

    Добавлены функции для более комфортной работы в WordPress 2.6; как следствие, устранены недостатки, связанные с отдачей устаревших данных (особенно это касается панели администратора).

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

गते गते पारगते पारसंगते बोधि स्वाहा