Get_Option()与Get_Theme_mod():为什么要慢一些?

时间:2014-07-18 作者:ntg2

我一直在使用get_theme_mod() 在我的各种项目中有一段时间。我决定利用WordPress v3中的主题定制API。4一旦它可用,我觉得它是我的客户不可或缺的工具。

过了一段时间,我开始注意到我的网站感觉比平时慢了一点,尤其是定制程序需要很长时间才能加载。在调查过程中,经过大量的尝试和错误,我决定尝试关闭type 注册我的设置时(即。$wp_customize->add_setting()) 从…起theme_modoption.

有一次我这样做了,把我所有的get_theme_mod() 调用到get_option(), 我注意到very significant 在前端,尤其是在后端的Customizer中,使用后一种设置来提高速度,而不是前者。我一直在查看WordPress的核心,试图找出原因,但似乎无法辨别这种情况下的具体问题。

社区可能对get_option() 执行速度明显快于get_theme_mod() 将不胜感激。

5 个回复
SO网友:Otto

答案是肯定的,theme\\u mod的功能会比较慢,但不会太明显,而且好处大于区别。

主题mod存储为选项。因此,本质上,theme\\u mod函数是围绕options函数的包装器。

首先,了解theme\\u mod设置存储为单个选项中的数组,并键入特定的主题名称。因此,如果我这样做:

set_theme_mod(\'aaa\',123);
set_theme_mod(\'bbb\',456);
然后,我在数据库中实际得到的是一个名为theme\\u mods\\u themename的选项行,其中包含一个序列化数组,其中包含(\'aaa\'=>123,\'bbb\'=>456)。

现在get_theme_mod 会慢一些,因为它实际上是两个get_option 呼叫。首先,它获取主题的名称。然后,它得到theme_mods_themename 选项所以这就是50%的速度损失。剩下的工作主要是在过滤器中完成的,因为有一个额外的过滤器调用,但是除非你在过滤器上有什么东西,否则这是微不足道的。

请注意,选项系统将检索到的数据存储在对象缓存中,因此它不会在此处进行多个数据库调用。只有第一次使用才会导致数据库命中。

这个set_theme_mod 会稍微慢一些,因为它会进行相同的两个get option调用,然后再进行另一个get_option 调用以再次获取主题名称,然后它会update_option 拥有全套现已更改的选项。这会导致数据库更新,而它发送更多数据的事实确实会导致明显的速度减慢。更新几个字节比更新较大的行快。但通常不会像你注意到的那么多。除非你有很多设置。。。

当然,theme mod函数可能需要进行总体优化,但您仍然应该使用它们,而不是get\\u选项,因为这是子主题。

直接使用选项行的问题是,您直接使用选项行,并且为设置使用特定的键名称。

如果我有一个名为“AAA”的主题,并且我为它创建了一个名为“BBB”的子主题,以便在另一个站点上使用,那么我的“AAA”主题可能会使用一个名为“示例”的选项。当我更新一个站点时,它会更新我的选项,那么现在相同的选项将应用于我的子主题。如果我不想让它这样做呢?如果我想让子主题使用一组不同的选项设置,该怎么办?

主题mods,通过将实际的主题名称(而不是硬编码的值)作为键的一部分,确保站点上的每个“主题”都使用自己的设置集。我可以来回切换,设置不会在它们之间转移,而是保持我设置的方式。更简单、更明显、更直观。

如果将来有一些核心更改或插件修改了theme\\u mods的工作方式,那么您将在不做任何更改的情况下自动获得这些好处。包装器总是会变慢,这是不可避免的,这是包装器的本质。尽管如此,您仍然在编写PHP代码,而不是机器语言。我们使用这样的包装器来简化事情和分离功能。主题不需要知道或关心其选项如何存储在数据库中,或命名如何工作。theme\\u mod函数提供了更简单、更干净的解决方案。

SO网友:Mark Kaplun

get_theme_mod 只是一个包装get_option. 理论上,因为它是另一个抽象层,所以它的工作速度较慢,但在实践中,这种差异不应大到足以引起人类的注意。

如果在theme\\u mod挂钩上挂接了一些速度较慢的代码,则可能会导致实际的速度差异。

SO网友:VykRevler

那么Customizer中会发生什么事情吗?我在这里看到了与OP相同的事情。

我可以确认,通过大约30个选项,我的定制器加载时间从3秒左右下降到了0.5秒左右get_option 结束get_theme_mod

直接调用这些方法,我看到了2ms的差异。

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

当您直接比较这些API时,可能不会注意到这一点,但在Customizer中它们是如何使用的,肯定有一些东西。

SO网友:T.Todua

你可以TEST THE TIME 属于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\'];
................
这会使网站速度更快吗?

SO网友:Tran Cuong

TL;DR:如果你是一个主题开发人员,你应该使用get_theme_mod

完整答案:

如果有100个get\\u选项调用,则需要对数据库进行100次查询。

如果有100个get\\u theme\\u mod调用,则只需对数据库进行一次查询。

为什么?因为所有主题mod都存储在一个数据库行中,并且只调用一个,而每个选项都是一行,100个get\\u选项调用将导致100个数据库查询,当然,这会降低网站的速度。

如果您的主题有很多选项,请使用get_theme_mod 将显著减少对数据库的查询数。

您可以通过以下方式检查性能和查询数Query Monitor Plugin

结束

相关推荐

Can't add options to db

我正试图为我的wordpress网站创建一个非常简单的选项页面,其中只包含一个选项-货币的兑换率。我有以下代码:add_action(\'admin_init\', \'currency_options_set\'); add_action( \'admin_menu\', \'admin_menu\' ); function admin_menu () { add_options_page( \'Currency Options\',\'Currency Opt