Intereting Posts
Media Modal не обновляется с загрузкой файла Попытка ограничить доступ к пользовательской мета-коробке без успеха Ошибка Wp_editor с foreach ()? Использование preg_replace для фильтрации пользовательского текстового поля Список отдельных месяцев в sidebar.php Добавление ссылки для зарегистрированного пользователя? При разработке целых сайтов для клиентов, можно ли управлять версиями всего сайта? WP API и прокси-сервер Вызвать дубликат регистрационной формы с другим URL-адресом Измерение и ограничение загрузки файлов Buddypress Добавить несертифицированные поля профиля в членах Loop Как удалить все записи из или удалить таблицу настраиваемых баз данных? Создать раскрывающееся меню всех тегов, используемых в категории Создание встроенной страницы в wordpress Как создать персонализированный тип сообщения, страница добавления новой которого является мастером многостраничного ввода

Должен ли я использовать Transient API для хранения HTML String или Object?

Предположим, что есть плагин, который отображает 20 связанных сообщений (для каждого сообщения) с очень сложным запросом. А затем используя данные из этого запроса, он строит сложный макет HTML. Кроме того, следует отметить, что плагин является общедоступным и может быть установлен на любом сервере с любой конфигурацией.

Что-то вроде:

/* complex and large query */ $related_posts = get_posts( ... ); $html_output = ''; foreach($related_posts as $key => $item) { /* complex layout rendering logic (but not as slow as the previous query) */ $html_output .= ...; } 

Поэтому мои вопросы:

  • Какой самый безопасный и самый правильный способ кэширования таких данных?
  • Должен ли я использовать Transient API для кэширования массива $html_output или строки $html_output ? Если я буду кэшировать строку $html_ouput , достигнет ли она предела максимального размера? Должен ли я, возможно, использовать его, прежде чем сохранять?
  • Должен ли я использовать Transient API вообще здесь?

Должен ли я использовать Transient API вообще здесь?

Нет.

В складе WordPress install transients хранятся в таблице wp_options и только очищаются во время обновления ядра. Предположим, у вас 50 000 сообщений, это 50 000 дополнительных строк в таблице опций. Очевидно, что они настроены на autoload = no, поэтому он не будет потреблять всю вашу память, но есть еще одно предостережение.

Поле autoload в таблице опций не имеет индекса, что означает, что вызов wp_load_alloptions() будет выполнять полное сканирование таблицы. Чем больше у вас строк, тем дольше это займет. Чем чаще вы пишете в таблице опций, тем менее эффективны внутренние кеши MySQL.

Если кешированные данные напрямую связаны с сообщением, вам лучше хранить его в метатете post. Это также будет сохранять ваш запрос каждый раз, когда вам нужно отображать кешированный контент, поскольку почтовые мета-кэши (обычно) загружаются во время поиска в WP_Query.

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

Еще один важный момент, который следует учитывать, заключается в том, что переходные процессы WordPress могут быть неустойчивыми в средах с постоянным кэшированием объектов. Это означает, что если вы храните свои кешированные данные в течение 24 часов в переходном режиме, нет абсолютно никакой гарантии, что он будет доступен через 23 часа или 12 или даже 5 минут. Бэкэнда для кеша объектов для многих установок – это хранилище ключей в памяти, такое как Redis или Memcached, и если выделенной памяти недостаточно для размещения новых объектов, более старые элементы будут выселены. Это огромная победа в мета-хранилище.

Недействительность также может быть более разумной, т. Е. Почему вы аннулируете кэширование связанных записей в X-часах? Это потому, что какой-то контент изменился? Добавлено новое сообщение? Назначен новый тег? В зависимости от вашего «сложного и большого запроса» вы можете сделать недействительным ТОЛЬКО, если что-то случится, что изменит результаты вашего запроса.

Должен ли я использовать Transient API для кэширования массива $ related_posts или строки $ html_output? Если я буду кэшировать строку $ html_ouput, достигнет ли она предела максимального размера? Должен ли я, возможно, использовать его, прежде чем сохранять?

Это зависит от размера вашей строки, так как это данные, которые будут поступать между PHP, MySQL и т. Д. Вам нужно очень стараться достичь пределов MySQL, но, например, ограничение по умолчанию для каждого объекта Memcached всего 1 мб.

Сколько времени занимает ваша «сложная логика отображения компоновки»? Запустите его через профилировщик, чтобы узнать. Скорее всего, он очень быстро никогда не станет узким местом.

Если это так, я бы предложил кешировать идентификаторы сообщений. Не объекты WP_Post, потому что они будут содержать полное содержимое сообщения, а всего лишь массив идентификаторов сообщений. Затем просто используйте WP_Query с post__in который приведет к очень быстрому запросу MySQL по первичному ключу.

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

Ничего себе, это много слов, надеюсь, что это поможет.

Не все WP Code являются общедоступными

Если вы собираетесь публиковать что-то публичное, то все то, что сказал kovshenin , совершенно верны.

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

Внешний кэш объектов – большая выгода, в любом случае

Если вы хотите установить внешний кеш постоянной памяти, вы можете это сделать.

Все сказанное в ответе kovshenin о переходных процессах и MySQL очень верно, и учитывая, что сам WP и куча плагинов используют кеш объектов … тогда улучшение производительности, которое у вас получилось, абсолютно стоит (небольших) усилий по настройке современной системы кэширования, такой как Redis или Memcached.

Кэшированные значения могут не быть там: это прекрасно

Более того, да, внешний кеш объектов не является надежным. Вы никогда не должны полагаться на то, что существует переходный период. Вы должны убедиться, что он работает, если кешировать не там, где они должны быть.

Кэш – notstorage, кеш – кеш.

Использовать кеш выборочно

См. Этот пример:

 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_* , поэтому, если внешний кеш не настроен, кеш происходит в памяти, а база данных никогда не участвует.
  • Использование кеша является фильтруемым, для обработки некоторых случаев краев, с которыми вы можете столкнуться

Нет Webscale, если нет кеша

Вы не должны пытаться решать проблемы с кешем. Если у вас проблемы со скоростью, вам следует подумать, что вы код.

Но для масштабирования веб-сайта в webscale достаточно использовать кеш.

И много раз (но не всегда) фрагмент, контекстно-зависимый кэш гораздо более гибкий и подходящий, чем агрессивное кэширование полной страницы.

Ваши вопросы:

Должен ли я использовать Transient API вообще здесь?

Это зависит .

Является ли ваш код потребляющим много ресурсов? Если нет, возможно, нет необходимости в кеше. Как сказано, это не просто вопрос скорости. Если ваш код работает быстро, но для пары пользователей требуется куча процессора и памяти … что произойдет, если у вас есть 100 или 1000 одновременных пользователей?

Если вы поймете, что кеш будет хорошей идеей.

… и является общедоступным кодом: возможно, нет . Вы можете рассматривать кеш выборочно, как в моем примере выше, в общедоступном коде, но обычно лучше, если вы оставляете такие решения исполнителям.

… и является частным кодом: возможно, да . Но даже для частного кода кешировать выборочно все равно хорошо, например, для отладки.

Помните, что в любом случае функции wp_cache_* могут предоставить вам доступ к кешу без риска загрязнения базы данных.

Должен ли я использовать Transient API для кэширования массива $ related_posts или строки $ html_output?

Это зависит от многих вещей. Насколько велика строка? Какой внешний кеш вы используете? Если вы собираетесь кэшировать сообщения, сохранение идентификатора в виде массива может быть хорошей идеей, запрос на приличное количество сообщений по их идентификатору довольно быстр.

Итоговые заметки

Transient API, вероятно, является одной из лучших вещей WordPress. Благодаря плагинам, которые вы можете найти для любых систем кэширования, он становится глупым простым API для большого количества программного обеспечения, которое может работать под капотом.

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

Вы редко слышите меня, говоря, что WordPress лучше, чем другие современные вещи, но переходный API – одна из немногих вещей, которые я пропускаю, когда я не работаю с WordPress.

Конечно, кэш очень сложный, не решает проблемы с кодом и не является серебряной пулей, но вам нужно создать сайт с высоким трафиком, который работает.

Идея WordPress использовать недооптимизированную таблицу MySQL для кэширования является совершенно безумной, но не лучше держать себя в стороне от кеша, потому что WordPress по умолчанию это делает.

Вам просто нужно понять, как все работает, а затем сделать свой выбор.

В предыдущих ответах уже выделено обязательное « Это зависит », к которому я полностью согласен.

Я хотел бы добавить рекомендацию, хотя, основываясь на том, как я « предполагаю », это было бы лучше всего сделано в описанном выше сценарии.

Я бы не использовал Transients в этом случае, а скорее Post Meta , из-за одного преимущества, которое у последнего есть: Control .

Поскольку вам необходимо кэшировать данные для каждой должности, объем данных, которые вы будете кэшировать, зависит от количества сообщений и со временем будет расти. Когда вы превысите определенное количество сообщений, вы можете попасть в пределы памяти, которую может использовать ваш кеш объектов, и он начнет стирать ранее сохраненные в памяти данные из памяти до истечения срока ее действия. Это может привести к ситуации, когда у вас большой приток посетителей, где каждый посетитель будет запускать «чрезмерно сложный SQL» при каждом запросе страницы, и ваш сайт полностью увязнет.

Если вы кешируете данные в вашей почтовой метатеге, вы можете не только контролировать, как она хранится и извлекаться, но вы также можете точно контролировать, как она обновляется. Вы добавили бы задание cron для этого, которое выполняется только в периоды времени, когда на сайт меньше трафика. Таким образом, «медленный запрос» никогда не встречается реальными пользователями сайта, и вы даже можете предварительно загрузить его, чтобы работа была выполнена, когда первый посетитель попадает.

Имейте в виду, что все кэширование – это компромисс! Вот почему обычный ответ: «Это зависит». и почему нет «священного кеширования».