Об’єктний кеш

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) необхідно встановити плагін. Таких плагінів кілька, тому що варіантів де зберігати такий кеш теж кілька, ось деякі з них:

Для того, щоб визначити, чи використовується постійне кешування. 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 .

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *