Об’єктний кеш
Object cache або Кеш об’єктів у WordPress – це механізм ядра, що дозволяє зберігати будь-які дані в кеш. Такий кеш використовується для збереження даних, які виходять багато разів у процесі коду або збереження даних отриманих після складних операцій.
Приклад об’єктного кешування
Розглянемо приклад кешування SQL запиту.
Допустимо, у нас є наступна функція. Якщо викликати цю функцію кілька разів поспіль, вона кожного разу виконуватиме запит до бази даних.
function myfunc() { return $wpdb->get_results( "SELECT ..."); } myfunc(); // SQL запит myfunc(); // SQL запит myfunc(); // SQL запит
Зробимо, щоб функція працювала з об’єктним кешем. І тепер тільки перший виклик функції виконає SQL запит, інші будуть брати дані з кешу.
function myfunc() { Global $wpdb; // пробуємо отримати кеш і повернемо його якщо він є $cache_key = 'my_cache_key'; $ cache = wp_cache_get ($ cache_key); if( false !== $cache ) return $cache; $value = $wpdb->get_results( "SELECT ..."); wp_cache_set ($ cache_key, $ value); // додамо дані в кеш return $value; } myfunc(); // SQL запит myfunc(); // Кеш myfunc(); // Кеш
Об’єктне кешування в WordPress
У WP таке кешування використовується практично скрізь: в опціях, записах, термінах, користувачів, метаданих і т.д.
Кешування об’єктів у опціях WordPress
Наприклад, розглянемо як працює кешування об’єктів в опціях WordPress. Функція get_option() не створює додаткових запитів до бази даних при множинному виклику саме завдяки такому кешу.
При першому виклику функції wp_load_alloptions() , яка завантажує з бази даних всі опції сайту (з прапором autoload ) в об’єктний кеш. Тепер будь-які наступні дзвінки функції get_option() вже не будуть робити запити до БД, а братимуть дані з кешу.
Так, наприклад, наступний код викликаний у файлі теми не зробить жодного запиту до БД:
if( ! get_option( 'comments_open' ) ){ echo '<p>Коментування на сайті'. get_option('blogname') .' закрито.</p>'; echo '<p>Зверніться до адміністрації: '. get_option('admin_email') .'</p>'; }
Кешування метаданих
За такою ж логікою працює і кеш метаданих. Наприклад, отримуючи записи за допомогою get_posts() , в кеш поміщаються дані постів та їх метаданих. Тому наступні звернення до даних вже опрацьованого посту не робитимуть додаткових запитів до БД.
// Припустимо, у цьому запиті були отримані пости: 1 2 3 4 5 $posts = get_posts(); foreach( $posts as $post ){ echo $post->post_title . '<br>'; } // далі в коді нам потрібні метадані посту 3 echo get_post_meta(3, 'my_meta', 1); / / Ці дані будуть взяті з кешу.
Постійне кешування об’єктів
За умовчанням кешування об’єктів у WordPress непостійне — це означає, що воно працює всередині одного HTTP запиту (тільки на генерацію однієї сторінки) і не працює між різними запитами (при відвідуванні нової сторінки кеш зі старої сторінки не використовується). По ходу генерації сторінки дані зберігається в кеш (оперативну пам’ять) і беруться туди, коли в коді знову запитуються ті самі дані. Наприклад, тому функція get_option() не робить щоразу запит у БД при чергових викликах, а бере дані з кешу об’єктів.
У WordPress є можливість увімкнути зовнішнє сховище для кешу об’єктів і таким чином зробити об’єктне кешування постійним . Так дані з кешу працюватимуть між запитами.
Для включення постійного об’єктного кеша (persistent object cache) необхідно встановити плагін. Таких плагінів кілька, тому що варіантів де зберігати такий кеш теж кілька, ось деякі з них:
- Redis Object Cache – використовує сервер Redis.
- Memcached Object Cache – використовує сервер Memcached.
- APC Object Cache – використовує сервер APC.
Для того, щоб визначити, чи використовується постійне кешування. WordPress використовує функцію wp_using_ext_object_cache() . Вона корисна для розробників, коли треба виконувати різні дії за наявності чи відсутності плагіна кешування.
Наприклад, збережемо значення у кеш об’єктів, тільки якщо кеш є постійним, інакше збережемо значення у файл:
if( wp_using_ext_object_cache() ){ wp_cache_set('key', 'value'); } else { // ваш код збереження даних у файл }
Групи
Параметр $group
функцій кешування дозволяє використовувати однакові ключі кешу.
Група – це префікс до ключа. Такий префікс використовується:
- при роботі з WordPress мультисайт («глобальні» та «не глобальні» групи).
- при використанні плагінів об’єктного кешування (постійні і непостійні групи).
У WordPress використовуються такі назви груп (ви також можете використовувати їх якщо вони підходять логічно, інакше назвати групу якось по-своєму):
Назва групи | Опис |
---|---|
(taxonomy)_relationships | масив term_id |
count | зберігає лічильники |
category | – |
posts | зберігає записи (пости) |
comment | група кешу для коментарів. |
default | група кешу за замовчуванням. |
options | Група кешу для зберігання опцій. |
themes | групи кешу для зберігання тем. |
plugins | групи кешу для зберігання плагінів. |
users | група кешу для зберігання інформації про користувачів. |
userlogins | – |
useremail | – |
userslugs | – |
transient | зберігає часові опції – set_transient() |
networks | – |
blog-details | – |
site-options | – |
sites | знайдені сайти |
site-transient | зберігає часові опції – set_site_transient() |
customize_changeset_post | – |
oembed_cache_post | – |
timeinfo | – |
calendar | – |
Глобальні групи (для мультисайту)
Працюють лише коли WordPress встановлений як мережа мультисайт .
До таких груп відноситься кеш, що є єдиним для всієї мережі.
Для кожного сайту мережі до ключа кеша додається префікс сайту, щоб відрізняти, наприклад, кеш запису з ID 5 одного сайту від кешу запису з таким самим ID 5 іншого сайту. Але також у мультисайті є об’єкти, які працюють для всієї мережі, наприклад, «Користувачі» — саме вони відносяться до глобальних груп, до кешу таких об’єктів префікс не додається.
За промовчанням глобальними групами є:
users userlogins usermeta user_meta useremail userslugs site-transient site-options blog-lookup blog-details site-details rss global-posts blog-id-cache networks sites themes
До списку глобальних груп можна додати свою групу, див. функцію wp_cache_add_global_groups(‘my-global-group’) .
Непостійні групи
За промовчанням у WordPress все кешування об’єктів непостійне, тобто. кешування відбувається лише на час створення сторінки. Але якщо встановити плагін кешування об’єктів, то кеш зберігатиметься між запитами (наприклад у файлах) і стане постійним.
Іноді треба, щоб кеш не зберігався постійно, а працював як і раніше (тільки під час генерації сторінки). Щоб досягти цього, можна вказати групу для кешу об’єктів, що створюється, і позначити цю групу як «Непостійна». Це робиться за допомогою функції wp_cache_add_non_persistent_groups( ‘my-group’ ) .
Так при збереженні кешу в групі «my-group», значення буде збережено тільки в локальний кеш (в оперативну пам’ять) і не зберігатиметься в сховищі плагіну, що кешує, наприклад на сервер Memcached.
Зазвичай до непостійних груп належать групи:
counts plugins themes
Вимкнення кешу об’єктів
Вимкнення для ділянки коду
Буває потрібно вимкнути роботу об’єктного кеша, наприклад, коли при імпорті потрібно додати до бази велику кількість записів і при звичайному запуску коду процес упирається в обмеження оперативної пам’яті на сервері. Відбувається це тому, що кожен запис, що додається, зберігається в кеші, а нам для одноразової операції це не потрібно.
За допомогою функції wp_suspend_cache_addition() можна тимчасово вимкнути об’єктний кеш.
wp_suspend_cache_addition (true); // відключаємо роботу кешу об'єктів // наш код... wp_suspend_cache_addition(false); // Включаємо назад
Повне вимкнення об’єктного кешування
Плагіни об’єктного кешування додають спеціальний файл enable_loading_object_cache_dropin :
add_filter( 'enable_loading_object_cache_dropin', '__return_false');
Хук з’явився у WP 5.8. Спрацьовує до підключення плагінів і потрібен коли код запускається не з Інтернету, наприклад при тестах.
Як перевірити чи об’єктний кеш увімкнено?
Зробити це можна за допомогою функції wp_using_ext_object_cache() :
if ( wp_using_ext_object_cache() ) { // Додаємо дані в кеш }
PHP Функції
- wp_cache_get( $key, $group, $force, $found )
- Отримує дані з об’єктного кешу за вказаним ключем та групою.
- wp_cache_add( $key, $data, $group, $expire )
- Додає дані в кеш, якщо кеша із вказаним ключем ще немає.
- wp_cache_set( $key, $data, $group, $expire )
- Додає дані до кешу об’єктів. Перезапише кеш, якщо вона існує.
- wp_cache_replace( $key, $data, $group, $expire )
- Замінює/оновлює дані вказаного кешу, тільки якщо кеш вже існує, інакше нічого не робить (поверне false).
- wp_cache_delete( $key, $group )
- Видаляє кеш за вказаним ключем та групою.
- wp_cache_flush( )
- Цілком очищає об’єктний кеш. Видаляє всі елементи об’єктного кешу.
- wp_cache_add_global_groups( $groups )
- Додає вказану групу об’єктного кешу до списку глобальних груп. Потрібно для мультисайту.
- wp_cache_add_non_persistent_groups( $groups )
- Позначає вказану групу/групи як непостійний кеш, тобто. який не слід зберігати для міжсесійного використання.
- wp_suspend_cache_addition( $suspend )
- Тимчасово зупиняє додавання об’єктів до об’єктного кешу.
- wp_using_ext_object_cache( $using )
- Перевірять, чи плагін (додатковий код) для постійного кешування об’єктів.
Функції-обгортки:
- wp_cache_get_multiple( $keys, $group, $force )
- Retrieves multiple values від cache in one call.
- wp_cache_add_multiple( $data, $group, $expire )
- Додайте кілька цін на карту в одному повідомленні, якщо клавіатури клавіатури не існують.
- wp_cache_set_multiple( $data, $group, $expire )
- Sets multiple values to cache in one call.
- wp_cache_delete_multiple( $keys, $group )
- Deletes multiple values від cache in one call.
- wp_cache_flush_runtime( )
- Повністю очищає об’єктний кеш, лише якщо він зберігається у пам’яті (не використовується постійне кешування). За постійного кешування нічого не робить.
Повний перелік функцій кешу об’єктів.
Дебаг об’єктного кешу
Щоб подивитися, як використовується кеш, можна встановити плагін «Debug Bar». У ньому можна подивитися статистику звернень у кеш об’єктів і пам’ять, що споживається (скільки важить елемент кеша).
Якщо встановлено плагін кешування об’єктів, Debug Bar покаже дані зовнішнього сервера.
–
При написанні використав матеріал із сайту wpmag.ru .