Не весь код WP является открытым
Если вы собираетесь выпустить что-то публичное, то все сказанное Ковшениным совершенно справедливо.
Все по-другому, если вы собираетесь написать личный код для себя или своей компании.
Кэш внешних объектов - это большое преимущество, в любом случае
Настоятельно рекомендуется устанавливать внешний постоянный кэш объектов , когда это возможно.
Все сказанное в ответе Ковшенина о переходных процессах и MySQL очень верно, и, учитывая, что сам WP и несколько плагинов используют кэш объектов ... тогда улучшение производительности, которое вы получили, абсолютно стоит (небольших) усилий по настройке. современная система кэширования, такая как Redis или Memcached.
Кэшированные значения могут отсутствовать: это нормально
Кроме того, да, внешний кэш объекта не надежен. Вы никогда не должны полагаться на тот факт, что переходный процесс там. Вы должны убедиться, что это работает, если кэшированные находятся не там, где они должны быть.
Кеш - это не хранилище, кеш - это кеш.
Используйте кэш выборочно
Смотрите этот пример:
function my_get_some_value($key) {
// by default no cache when debug and if no external object_cache
$defUse = ! (defined('WP_DEBUG') && WP_DEBUG) && wp_using_ext_object_cache();
// make the usage of cache filterable
$useCache = apply_filters('my_use_cache', $defUse);
// return cached value if any
if ($useCache && ($cached = get_transient($key))) {
return $cached;
}
// no cached value, make sure your code works with no cache
$value = my_get_some_value_in_some_expensive_way();
// set cache, if allowed
$useCache and set_transient($key, $value, HOUR_IN_SECONDS);
return $value;
}
Использование подобного кода в вашем частном месте, производительность сайта может улучшить много , особенно если у вас есть много пользователей.
Обратите внимание, что:
- По умолчанию кеш не используется при включенной отладке, так что, надеюсь, в вашей среде разработки. Поверьте, кеш может сделать отладку адом
- По умолчанию кеш также не используется, если WP не настроен на использование внешнего кеша объектов. Это означает, что все проблемы, связанные с MySQL, не существуют, потому что вы не используете переходные процессы, когда они используют MySQL. Вероятно, более простой альтернативой было бы использование
wp_cache_*
функций , поэтому, если внешний кэш не настроен, тогда кэш создается в памяти, а база данных никогда не задействуется.
- Использование кэша фильтруется, чтобы справиться с некоторыми крайними случаями, с которыми вы можете столкнуться
Нет веб-шкалы, если нет кэша
Вы не должны пытаться решить проблемы со скоростью кеша. Если у вас есть проблемы со скоростью, вам следует пересмотреть свой код.
Но для масштабирования веб-сайта на веб-уровне кэш-память довольно необходима .
И во многих случаях (но не всегда) фрагментно-зависимый кеширование является гораздо более гибким и подходящим, чем агрессивное кеширование полной страницы.
Ваши вопросы:
Должен ли я использовать Transient API вообще здесь?
Это зависит .
Ваш код потребляет много ресурсов? Если нет, возможно, нет необходимости в кеше. Как сказано, это не просто вопрос скорости. Если ваш код работает быстро, но требует нескольких ресурсов процессора и памяти для пары пользователей ... что произойдет, если у вас 100 или 1000 одновременно работающих пользователей?
Если вы понимаете, кеш будет хорошей идеей ..
... и является открытым кодом: вероятно, нет . Вы можете рассмотреть выборочное кэширование, как в моем примере выше в публичном коде, но обычно лучше, если вы оставляете такие решения разработчикам.
... и это частный код: очень вероятно, да . Но даже для частного кода выборочное кеширование все еще хорошо, например, для отладки.
В любом случае, помните, что wp_cache_*
функции могут предоставить вам доступ к кешу без риска загрязнения базы данных.
Должен ли я использовать Transient API для кэширования массива $ related_posts или строки $ html_output?
Это зависит от многих вещей. Насколько велика строка? Какой внешний кеш вы используете? Если вы собираетесь кэшировать посты, то сохранение идентификатора в виде массива может быть хорошей идеей, поскольку достаточно быстро запросить приличное количество постов по их идентификатору.
Финальные заметки
Transient API - это, вероятно, одна из лучших вещей WordPress. Благодаря плагинам, которые вы можете найти для любого типа систем кэширования, он превращается в глупый простой API для большого количества программ, которые могут работать под капотом.
За пределами WordPress очень сложно найти такую абстракцию, которая работает «из коробки» с кучей различных систем кеширования и позволяет переключаться с одной системы на другую без особых усилий.
Вы редко слышите, как я говорю, что WordPress лучше других современных вещей, но переходный API - одна из немногих вещей, которые мне не хватает, когда я не работаю с WordPress.
Конечно, кеш труден, не решает проблем с кодом и не является серебряной пулей, но это то, что вам нужно для создания сайта с высоким трафиком, который работает.
Идея WordPress использовать недостаточно оптимизированную таблицу MySQL для кеширования довольно безумна, но не лучше держаться подальше от кеша только потому, что WordPress по умолчанию это делает.
Вам просто нужно понять, как все работает, а затем сделать свой выбор.