WP的缓存如何在页面重载过程中保持持久性?

时间:2019-03-06 作者:coolpasta

我已经彻底分析了WP的缓存、它的功能和它的功能,虽然它的设计很简单,但它是有效的:一个对象,您不断添加可能在其他地方使用的数据,这样您就不会访问数据库。

好吧,但是PHP是无状态的。当谈到动态实体时,它在会话之间什么都不记得,因此,每一个新的请求都意味着一个新的生命周期。

它显然不在数据库中。拥有“全局共享”缓存也可能没有意义,因为每个用户的变量可能不同,因此,如果一个用户以某种方式请求帖子,另一个用户很可能会以另一种方式(过滤器)请求帖子,WordPress doesn\'t do it - it\'s not in the database either as a transient / option.

那么,这是怎么发生的呢?

考虑到它是无状态的,除非同一个查询运行两次,否则缓存不是没有用处吗?因为它在会话关闭时终止,所以之前运行的查询将无法检索其结果。

Edit:

我明白什么__destruct 但在这种情况下,缓存既不会保存在会话变量中,也不会保存在用户的缓存中,也不会。。。没有,只是returns True.

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

简单的回答是:it doesn\'t

这并不意味着它不能持久化,也不意味着它不能提高性能。

尽管没有持久性,但性能还是得到了提高,假设我们获取了5篇文章,并且在每篇文章上我们都检索到了各种post meta。你可能会认为get_post_meta 导致额外的DB查询,但您可能错了。WP提前获取所有post元,并通过WP缓存进行存储。当模板获取这些值时,它将从WP缓存中获取,以避免多个数据库查询。

同样,如果您使用各种函数来检索术语、帖子等,它们会缓存在WP缓存中。通过这种方式,可以使用WP Cache来确保只从数据库中提取一次数据,并作为一种优化,即使WP Cache在请求结束时丢失。您将看到许多中间开发人员试图实现这一点以避免DB查询,而WP在幕后已经做到了这一点

使其持久化,您可以使用拖放文件来提供使用持久数据存储的WP缓存实现。例如,我使用Memcached dropin,其中有几个实现。这通常是使用在内存中存储数据的无密钥库SQL数据库来完成的。

对于每个用户的数据,它不会持久化,或者如果是持久化的,则会使用命名空间,或者在键中包含用户ID,以便不会发生冲突。

请记住,这将需要第三方软件,无论是Memcache、Redis等,大多数主机都不会提供。

话虽如此,the performance gains of a persistent object cache can be immense

瞬态是唯一持续存在的部分,它们存储在选项表中。然而,如果存在持久对象缓存,它们也会缓存在WP缓存中,从而提高速度。

整页缓存WP不进行页面缓存,但可以通过插件添加。然而,这些插件如何做到这一点取决于插件,有许多不同的方法和实现,您需要参考插件文档和支持途径