update_post_(meta / term)_cache的说明


23

我正在阅读10up的一些最佳实践,他们提到在WP_Query中将这两个标志设置为false(取决于您要查询的内容):

  • 'update_post_meta_cache' => false:在将不使用后meta时有用。
  • 'update_post_term_cache' => false:在不使用分类术语时很有用。

假设它利用类似的东西,update_post_caches()但我什至不能100%知道这意味着什么。有人可以解释这两个标志在a中的含义WP_Query以及它们的作用吗?信息越多越好,因为我对WordPress如何缓存事物一无所知,但是对于这两个标志的深思熟虑的答案也是可以接受的。

Answers:


30

对象缓存无处不在

WordPress尝试尽可能减少数据库查询的数量。

例如,无论何时获得元字段或分类字段,在查询数据库之前,WordPress都会查看是否已查询并存储在缓存中的内容,然后从那里返回而不是查询数据库。

“缓存作业”是通过WP_Object_Cache类和wp_cache_*函数(这些类方法的包装器)完成的。

缓存所在的位置

默认情况下,“缓存”仅是PHP全局变量。这意味着它在内存中,但也意味着它在每次请求时都消失。

但是,通过dropins(advanced-cache.php和/或object-cache.php),可以设置自定义方式来处理此缓存。

通常,此dropins用于设置某种可以“保留”单个请求的缓存机制。

因此,在WP人员中,这些被称为“持久性缓存”插件(即使在气泡之外,“缓存”和“持久性”一词并没有多大意义)。

如今,流行的选择是MemcachedRedis

因此,使用“持久性缓存”插件可以大大减少数据库查询的数量,因为不会在每个请求上都更新缓存。

一些例子

$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);

上面的2行代码最多将触发1个数据库查询。

实际上,当您查询自定义字段时,该帖子的所有字段都从数据库中检索出来,通过对象缓存进行缓存,并且随后的请求从缓存中而不是从db中提取数据。

分类学术语也是如此,WordPress将一次提取所有分类学术语,然后从缓存中返回它们。

对象缓存在WordPress中使用非常广泛。不仅用于帖子,元值和分类法,而且还用于用户,评论,主题数据...

WP_Query一切有什么关系?

WP_Query默认情况下,当您通过查询查询某些帖子时,WordPress不仅将它们从数据库中拉出(或从缓存(如果已缓存)中拉出),还会更新所有自定义字段和与拉出的帖子相关的所有分类法的缓存

因此,例如,当您打电话get_the_terms()get_post_meta()循环通过来的帖子时WP_Query,您实际上不会触发任何数据库查询,而是从缓存中提取信息。

很好,不是吗?

好,是的,但是要付出代价。

WordPress WP_Queryupdate_meta_cache元和update_object_term_cache分类法中通过拉入发布时所做的缓存更新“魔术” 。

如果您查看这些函数的源代码,您会发现WordPress在每个函数中仅执行一个数据库查询,但也进行了大量处理。例如,在update_object_term_cache其中有7个嵌套foreach ...如果您有很多分类法,并且每页的帖子数很高,则效果不是很好。

WP_Query最后,关于这些论点

什么'update_post_meta_cache''update_post_term_cache'何时设置做false是为了防止WordPress的更新缓存自定义字段和分类,分别。

在这种情况下,第一次查询自定义字段或分类法时,将触发数据库查询,并缓存数据。

值得麻烦吗?

像往常一样,答案是取决于。在大多数情况下,将这些值设置为false,是一个不错的选择,因为它可以避免不必要的处理和数据库查询(如果不需要的话),并且无论何时第一次需要使用自定义字段/分类法术语时,都会更新缓存。

但是,如果get_post_meta()在循环期间要调用一次,甚至要调用一次,并且要调用get_the_terms()帖子支持的所有(或大多数)分类法,则无论如何都会触发缓存更新,并且可能没有任何实际好处。将这些查询参数设置为false


整齐!与往常一样,您的见解始终受到通用汽车的赞赏。是否将瞬态视为“持久性缓存”?那么,在WP_Query期间,原因wp_reset_postdata()是要重置global $post并重置对象缓存?听起来,如果我执行了自定义WP_Query,它将创建一个新的缓存对象,但是将其重置也必须重新查询以获取原始缓存。也许在这个问题的背景下我走得太远了。
Howdy_McGee

1
@Howdy_McGee对象缓存和发布对象无关。因此wp_reset_postdata(),在对象缓存方面什么也不做。wp_reset_postdata()仅重置全局发布对象,这是另一个从未缓存过的全局变量...瞬态是一回事:当您安装了一些持久性缓存插件时,可以暂时使用它,但是如果您没有持久性缓存插件,则可以使用瞬态使用数据库。
gmazzap

啊,我只是抓住了这个global variable概念,并假设它是global $post或全局$wp_query对象,感谢您的澄清!
Howdy_McGee

旁注中fields => 'ids'将两个缓存都设置为false。我认为对象缓存仅适用于对象是有意义的,但我想我只想提
一句

3

这里的主要关注点是update_post_caches功能。在WP_Query从数据库获取所有帖子之后调用它。通常,您希望帖子首先显示的原因通常是显示它们,这通常意味着显示术语和基于元数据的内容,因此WP_Query还将默认在数据库中查询与返回的帖子相关的元数据和术语数据并将其存储在缓存中*。从WP_Query返回的数据中没有显式提供此信息,但是当您调用相关API来获取特定帖子的字词和元信息时,该信息已经在内存中可用,因此无需发送新的查询到数据库。

这使得wordpress通过仅发送一个请求以获取所有帖子的信息,而不是每个帖子发送一个请求,从而减少了与向DB发送请求相关的开销。

现在,我找不到任何不重要的示例,说明您何时不希望更新缓存,但是如果您只想要所有帖子的标题列表,则可能是一个不重要的示例。为此,您不需要术语或元数据。

* cache-此处最重要的是基于内存的缓存,其中WP在不激活任何对象缓存插件的情况下,将从数据库获取的所有内容存储到almot。显然,当您有对象缓存时,信息也将存储在该处。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.