it-swarm.com.ru

get_option () против get_theme_mod (): почему один медленнее?

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

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

Как только я сделал это и обменял все свои вызовы get_theme_mod() на get_option(), я заметил очень значительное увеличение скорости при использовании последней настройки в отличие от первой на внешнем интерфейсе и особенно в настройщике на бэкенде. Я просматривал ядро ​​WordPress, пытаясь найти ответ на вопрос, почему это так, но, похоже, не могу понять, что такое зависание в этом сценарии.

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

15
ntg2

Ответ: да, функции theme_mod будут работать медленнее, но незначительно, а преимущества перевешивают различия.

Тематические моды хранятся в виде опций. Итак, по сути, функции theme_mod являются обертками для функций параметров.

Во-первых, следует понимать, что настройки theme_mod хранятся в виде массива в одной опции, привязанной к конкретному названию темы. Итак, если я сделаю это:

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

Тогда то, что я на самом деле получаю в базе данных, это одна строка опций с именем theme_mods_themename, которая содержит сериализованный массив с ('aaa' => 123, 'bbb' => 456) в нем.

Теперь get_theme_mod будет медленнее, потому что он фактически делает два вызова get_option. Во-первых, он получает название темы. Затем он получает опцию theme_mods_themename. Так что тут потеря скорости 50%. Остальная часть проделанной работы заключается в основном в фильтрах, в том, что есть дополнительный вызов фильтра, но если у вас нет чего-то в этом фильтре, это довольно незначительно.

Обратите внимание, что система опций сохраняет извлеченные данные в кеше объектов, поэтому здесь не нужно выполнять несколько вызовов базы данных. Только первое использование приводит к попаданию в базу данных.

set_theme_mod будет несколько медленнее, потому что он делает те же самые два вызова get опций, затем он делает еще один вызов get_option, чтобы снова получить имя темы, и затем делает update_option с полным набором теперь измененных опций. Это вызывает обновление базы данных, и тот факт, что она отправляет намного больше данных, действительно может быть причиной заметного замедления. Обновление нескольких байтов происходит быстрее, чем обновление строки большего размера. Но обычно не так много, как вы заметили. Если у вас нет чертовски много настроек ...

Функции мода темы, вероятно, должны быть оптимизированы в целом, но, тем не менее, вы все равно должны использовать их вместо get_option и так далее, потому что дочерние темы.

Проблема с использованием строк параметров напрямую заключается в том, что вы используете их напрямую и используете конкретные имена ключей для своих настроек.

Если у меня есть тема под названием "AAA" и я создаю дочернюю тему под названием "BBB" для использования на другом сайте, тогда моя тема "AAA" может использовать параметр с именем "example". Когда я обновляю один сайт, и он обновляет мой параметр, то этот же параметр теперь будет применяться к моей дочерней теме. Что если я не хочу этого делать? Что, если я хочу, чтобы дочерняя тема использовала другой набор параметров?

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

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

19
Otto

get_theme_mod - это просто оболочка вокруг get_option. Теоретически, поскольку это еще один уровень абстракции, он будет работать медленнее, но на практике разница не должна быть достаточно большой, чтобы ее заметил человек.

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

3
Mark Kaplun

Вы можете ТЕСТИРОВАТЬ ВРЕМЯ из 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'];
................

это сделает сайт немного быстрее?

1
T.Todua

Может ли что-то происходить в настройщике тогда? Я вижу то же самое, что и ОП здесь.

Я могу подтвердить, что примерно с 30 опциями время загрузки моего Customizer уменьшилось с 3 секунд до примерно 5 секунд при переключении на get_option поверх get_theme_mod

Вызывая методы напрямую, я вижу разницу в 2 мс.

test_results ( https://Gist.github.com/anonymous/d98a46d00d52d40e7dec )

Это может быть незаметно при непосредственном сравнении API, но должно быть что-то с тем, как они используются в Customizer.

0
VykRevler