get_option () vs get_theme_mod (): Чому одна повільніше?


17

Я get_theme_mod()деякий час використовую в різних моїх проектах. Я вирішив скористатися API налаштування теми в WordPress v3.4, коли він був доступний, оскільки я вважав, що це незамінний інструмент для моїх клієнтів.

Через деякий час я почав помічати, що мої сайти відчувають себе дещо млявішими, ніж зазвичай, і завантажувальникові, зокрема, користувачеві потрібно було досить багато часу. Завдяки безлічі спроб і помилок під час мого розслідування я вирішив спробувати вимкнути цю функцію typeпри реєстрації моїх налаштувань (тобто $wp_customize->add_setting()) з theme_modдо option.

Після того, як я це зробив і замінив усі свої get_theme_mod()дзвінки get_option(), я помітив дуже значне збільшення швидкості, використовуючи останнє налаштування, на відміну від першого на фронті, а особливо в програмі Customizer на бекенді. Я переглядав серцевину WordPress, намагаючись розібратися з тим, чому це відбувається, але не можу зрозуміти, яка саме ситуація в цьому сценарії.

Будь-яка думка, яку може мати громада щодо того, щоб зробити її get_option()значно швидшою, ніж get_theme_mod()була б вдячна.


1
Якщо ви подивитесь /wp-includesна те, option.phpде get_option()визначено, і theme.phpде get_theme_mod()визначено, ви можете побачити, що останній насправді викликає get_option()себе, діючи як розширення його, що також застосовує будь-які необхідні фільтри. Можна пояснити, чому це повільніше.
Джоді Хіванер

1
Джоді, я думав, що сам, але відчувається, що просто посилання get_option()та застосування деяких фільтрів не повинно змусити його сповільнюватися настільки істотно, як це було. Безумовно, чудова відправна точка, але мені цікаво, чи немає ще чогось у творах.
ntg2

3
Тут немає жодної причини для різниці швидкостей, тому я підозрюю, що щось інше спричиняє ваші сприйняті відмінності. Теми модів зберігаються як самі опції.
Отто

Чи може процес серіалізації / несеріалізації в отриманні окремих мод відігравати в цьому певну роль? Мені цікаво, якщо ця додаткова робота з вилучення мода могла б стати зависокою, на відміну від простого вибору опції без необхідності цього робити. При внесенні зміни від get_theme_mod()до get_option()швидкості всіх проектів в два рази в середньому на обох веб - інтерфейсі і в налагоджувальника. Це була єдина зміна, яка була внесена в намаганні ізолювати її від будь-яких інших побічних ефектів.
ntg2

Відповіді:


19

Відповідь, що так, функції теми_mod будуть повільнішими, але не суттєво, а переваги переважають за різницями.

Теми модів зберігаються як опції. Отже, по суті, тематичні функції - це обгортки навколо функцій опцій.

По-перше, зрозумійте, що параметри теми_mod зберігаються як масив в одному варіанті, присвоєному конкретному імені теми. Отже, якщо я це роблю:

set_theme_mod('aaa',123);
set_theme_mod('bbb',456);

Тоді те, що я насправді отримую в базі даних, - це єдиний рядок параметрів з назвою topic_mods_themename, який містить серіалізований масив з ('aaa' => 123, 'bbb' => 456) у ньому.

Тепер get_theme_modбуде повільніше, тому що він насправді здійснює два get_optionдзвінки. По-перше, він отримує назву теми. Потім він отримує theme_mods_themenameваріант. Так ось, це 50% втрати швидкості. Решта виконаної роботи полягає в основному у фільтрах, у тому, що є додатковий виклик фільтра, але якщо у вас є щось на цьому фільтрі, це нібито несуттєво.

Зверніть увагу, що система параметрів зберігає отримані дані в об'єктному кеші, тому тут не здійснюються багаторазові дзвінки до бази даних. Лише перше використання призводить до звернення до бази даних.

set_theme_modБуде трохи повільніше , тому що вона робить ті ж два отримати варіанти викликів, то він робить ще один get_optionдзвінок , щоб отримати назву теми ще раз, а потім він робить update_optionз повним набором опцій в даний час змінилися. Це спричиняє оновлення бази даних, і той факт, що вона надсилає набагато більше даних, справді може бути причиною помітного сповільнення. Оновлення кількох байтів швидше, ніж оновлення великого рядка. Але зазвичай не так, як ви помітили. Якщо у вас є цілий чорт з великою кількістю налаштувань ...

Тематичні функції мод, ймовірно, пов'язані з оптимізацією в цілому, безумовно, але все ж слід використовувати їх замість get_option, і тому, що дочірні теми.

Проблема з прямим використанням рядків опцій полягає в тому, що ви використовуєте їх безпосередньо та використовуєте конкретні імена ключів для своїх параметрів.

Якщо у мене є тема під назвою "AAA", і я роблю дочірню тему під назвою "BBB" для використання на іншому веб-сайті, то моя тема "AAA" може використовувати параметр з назвою "example". Коли я оновлюю один веб-сайт, і він оновлює свою опцію, то цей самий варіант буде застосовано до моєї дочірньої теми. Що робити, якщо я не хотів цього робити? Що робити, якщо я хотів, щоб дочірня тема використовувала інший набір параметрів параметрів?

Модні теми, включаючи власне назву теми (а не значення з твердим кодом) як частину ключа, забезпечують, щоб кожна "тема" на сайті використовувала власний набір налаштувань. Я можу перемикатися вперед і назад, і налаштування не передаються між ними, вони залишаються як я їх встановив. Простіший, очевидніший, інтуїтивніший.

І якщо якась майбутня зміна ядра чи плагін змінить те, як працюють theme_mods, ви автоматично отримаєте переваги від цього без будь-яких змін. Пакувальники завжди йдуть повільніше, це неминуче, це природа обгортки. Тим не менш, ти все ще пишеш PHP-код, а не машинною мовою. Ми використовуємо подібні обгортки для спрощення речей та окремої функціональності. Теми не повинні знати або дбати про те, як зберігаються їх параметри в базі даних або як працює іменування. Функції theme_mod забезпечують більш просте рішення, яке є більш чистим.


3

get_theme_modце просто обгортка навколо get_option. Теоретично, оскільки це ще один шар абстракції, він буде працювати повільніше, але на практиці різниця не повинна бути достатньо великою, щоб людину помічали.

Фактичні різниці швидкостей можуть бути спричинені, якщо на гаках теми_mod зачеплений повільний код.


1

Чи може тоді в "Customizer" щось трапитися? Я бачу те саме, що і тут.

Я можу підтвердити, що приблизно з 30 опцій час завантаження моїм інструментом Customizer зменшився приблизно з 3-х до приблизно .5с при переході на get_optionперехідget_theme_mod

Викликаючи методи безпосередньо, я бачу різницю в 2 мс.

тестові результати ( https://gist.github.com/anonymous/d98a46d00d52d40e7dec )

Це може бути непомітно, якщо ви порівнюєте API безпосередньо, але має бути щось із тим, як вони використовуються в Customizer.


1

Ви можете перевірити час з get_option(100 ітерацій) з допомогою цього коду (поставити functions.phpабо де - небудь):

add_action('wp','My_Test');
function My_Test(){
    var_dump(microtime(true));
    for ($i=1; $i<100; $i++) { get_option('blogdescription'); }
    var_dump(microtime(true));
    for ($i=1; $i<100; $i++) { get_theme_mod('blogdescription'); }
    var_dump(microtime(true));
    exit;
}   




Ще одна думка

Я не знаю, якщо це має значення (можливо, розробники Wordpress це знають краще), але я подумав, що якщо веб-сайт має ВИСОКИЙ трафік, і на кожну завантаженість сторінки йому потрібно отримати сотні варіантів, то що робити, якщо я приєднаюся багато варіантів в один get_option? подобається це:

update_option('my_extra_optss',  array(
      'myNAME' => 'George',
      'myAGE'  => 43 ));

потім :

$x = get_option('my_extra_optss');
$x['myNAME'];
$x['myAGE'];
................

це зробить сайт трохи швидшим?


2
Саме це вже робить get_theme_mod. Усі модні теми вже об’єднані в єдиний варіант. Щоразу, коли ви дзвоните get_theme_mod, він робить два дзвінки до бази даних уперше, а нульові дзвінки - після цього.
Отто

0

TL; DR: Якщо ви розробник тем, вам слід скористатися get_theme_mod

Повна відповідь:

Якщо у вас є 100 викликів get_option, до вашої бази даних потрібно 100 запитів.

Якщо у вас 100 дзвінків get_theme_mod, до вашої бази даних потрібно лише 1 запит.

Чому? Оскільки всі модні теми зберігаються в одному рядку бази даних і називатимуться лише одним, тоді як кожен варіант - це рядок, і 100 викликів get_option призведе до 100 запитів до бази даних, і, звичайно, це уповільнює ваш сайт.

Якщо ваша тема має багато варіантів, використання get_theme_mod значно зменшить ваш номер запиту до бази даних.

Ви можете перевірити ефективність та кількість запитів за допомогою модуля Query Monitor

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.