我第一次接触WordPress Transients API是在几年前。我在我的一个博客上查看数据库表,发现我的wp_options表格中有来自WordPress瞬态API的数百个条目。在我的无知中,我想清除这些来优化我的数据库表,没有意识到Transients API是多么简单和有用。

根据WordPress法典,WordPress transient API“提供了一种简单而标准化的方式,通过给数据一个自定义名称和一个时间框架来临时存储缓存数据,在此之后数据将过期并被删除。”在标准的WordPress安装中,它将这些缓存数据存储在wp_options表格如果WordPress主机启用了memcached,那么这个缓存将持久化在内存中,而不是数据库中。

WordPress的强大之处在于它是一个动态的、数据库驱动的内容管理系统。这种能力带来了性能问题,因为每次加载一个页面时,都会运行另一个数据库查询,而大多数情况下,数据库根本没有改变。数据库查询需要花费时间和处理资源,如果您有数百或数千人同时访问您的数据库,那么由于所yb体育正式官网首页有冗余的数据库查询,您肯定会遇到性能问题。

使用Transients API

当你想要缓存一个计算密集型且不经常改变的值时,你就需要使用Transients API。在WordPress中,这通常是数据库查询的结果对象,但它也可以是你存储在变量中的任何东西,无论是标量值、数组还是对象。让我们看一个带有自定义WP_Query对象的简单示例。

下面的查询将检索数据库中类别为“Microsoft”的所有帖子。

$my_query = new WP_Query('category_name=microsoft');

由于帖子列表仅在发布新文章时才会更改,所以让我们将该查询包装到Transients API中,并将结果存储一个小时。

//获取我们的瞬态数据的任何现有副本if (false === ($my_query = get_transient('my_query'))){//它不存在,因此重新生成数据并保存瞬态$my_query = new WP_Query('category_name=microsoft');set_transient('my_query', $my_query, 1 * HOUR_IN_SECONDS);} //像往常一样使用数据…

当你打电话时set_transient,在这种情况下,它会保存变量的值my_query美元,作为一个短暂的名字my_query.它的有效期是1小时。注意,过期时间是数据将被缓存的最大时间,而不是绝对时间。它可以并且将在过期时间之前被删除,特别是当您使用Memcached作为内存中的对象缓存时,但是在过期时间到达后将永远不会返回。过期后,再次运行查询以重新生成一个新的瞬态。确保您认识到存储在transient中的值是缓存,而不是数据存储。

在开发过程中,请等到几乎完成后再添加瞬态代码。如果您试图使查询或函数的结果更加完美,那么过早地引入结果缓存会让您感到不适。

您还需要注意,您需要为瞬态提供一个不超过40个字符的惟一名称。我们曾经有一个自定义查询,它运行在特定于特定帖子的每篇文章页面上。我需要将post ID附加到每个瞬态名称的末尾,以使每个名称都是唯一的。

删除瞬态

如果您要从数据库中缓存一个帖子列表,那么您的代码必须处理某人发布或删除帖子的时间。如果您什么都不做,您的自定义查询将会过期,直到它过期为止。

在我们的例子中,我们连接到后状态转换每当发布或删除一篇文章时删除瞬态。根据你想要完成的任务,你可能需要观察更多的事件,比如后期编辑等等。

函数delete_transient($ID, $post) {delete_transient('my_query');} add_action('publish_post', 'delete_transient', 10,2);Add_action ('trash_post', 'delete_transient', 10,2);

使用查询监视器

如果您正在开发自己的代码,通常很容易找到值得缓存的数据结果。然而,如果你正在使用别人的代码、主题或插件,你就需要一个工具来查找数据库查询活动。我们使用查询监控在任何时候,一个伟大的插件,将显示所有的数据库查询运行的特定页面加载,以及运行这些查询需要多长时间。

当您运行Query Monitor时,您将看到各种各样的查询正在运行,例如WordPress选项、用户或分类法术语。注意WP_Query->get_posts,这通常是最昂贵的数据库查询。它们通常是使用Transients API的很好的候选者。

最新的开发者博客文章

GeekWork上的工作清单

找到更多的工作GeekWork.雇主,在这里发布工作