我什么时候应该使用Transients API?


16

我以前从未使用过Transients API,并且想知道是否有人对何时使用它提供了指导。该法典文章暗示为主题的开发者,我可能需要设置每一个新的WP_Query()为一过性; 我认为直接$ wpdb查询和也可以这样说query_posts()。那是过度杀伤力吗?和/或还有其他地方我应该默认使用它?

我经常在我的站点上使用缓存插件(通常是W3 Total Cache),听起来好像使用Transients可能会提高插件的有效性,但是如果这不是最佳实践,我不想疯狂地将所有内容包装在瞬态中。


谢谢大家,我希望我可以将多个答案标记为“解决方案”。很棒的信息,非常感谢!
米歇尔2012年

Answers:


16

当您在主题和插件中进行复杂的查询时,瞬态非常有用。我倾向于将瞬态用于菜单之类的东西,并在边栏中显示诸如Twitter的Tweets之类的其他东西。我绝对不会将它们用于所有其他事情,因此只能使用可缓存的临时数据。

请记住,如果您使用带有瞬态的Memcached之类的东西,那么您将注意到巨大的性能提升。瞬态的规则是不要将它们用于不应过期的数据,因为它们实际上仅用于临时数据,并且请记住,瞬态并不总是存储在数据库中。

瞬态的一些用途

  • 复杂和自定义数据库查询
  • WordPress导航菜单
  • 侧栏小部件,显示信息,例如;鸣叫,最近的站点访问者列表或Flickr照片流
  • 缓存标签云

本文是一篇非常有用的文章,提供了快速的基准测试,展示了瞬态如何加快您的网站速度,甚至提供了一些示例。另一篇文章也提供了一些使用瞬态的出色示例,这些示例可能也有助于您了解如何使用瞬态。


2
另一个用途:缓存外部HTTP请求。就像点击twitter API。不要在每次页面加载时都这样做,请使用瞬态来缓存结果。
chrisguitarguy 2012年

11

WordPress中有几种​​缓存机制,其机制各不相同,具体取决于对象缓存的选择(本机或非本机):

+-----------+-------------------------+---------------------+
|           |         Native          | Object cache plugin |
+-----------+-------------------------+---------------------+
| Option    | Persistent (database)   | N/A                 |
| Transient | Persistent (database)   | Persistent (varies) |
| Cache     | Non-persistent (memory) | Persistent (varies) |
+-----------+-------------------------+---------------------+

简而言之,这意味着瞬态始终是持久的(与本机Cache不同,瞬态将在页面加载之间保留),但如果提供了瞬态,它将利用自定义存储(与Option不同)。

这使瞬变成为缓存的最通用选择。

但是,灵活性带来了当前的复杂性,并且它们之间有很多细微差别(例如名称长度的限制,带有或不带有到期期限的不同行为,缺少垃圾回收)使它们变得比看起来复杂。

总体:

  • 使用选项保存必须持久的内容
  • 使用Transients缓存其他内容
  • 当您对这三个方面都有很好的了解时,请使用Cache并知道Cache比其他情况更适合用例(这种情况很少见)

4

我认为可以通过不两次调用get_transient函数来改进Sterling的代码。而是将第一个结果存储在一个临时变量中。因为Transient API背后的思想是速度;-)

private function _get_data( $query) {
    $result = get_transient( $query );
    if ( $result ) {
       return $result;
    } else { 
       return $this->_get_query( $query ); 
    }
}

3

简短的回答:您应该在可能的地方/地点使用它。

长答案:

Transients API用于缓存。因此,您想尽可能多地使用它。您可以编写一个为您执行此操作的函数。

这不是矫kill过正,如果做得正确,最终会很优雅:

// If the transient isn't false, then you can just get the cached version.
// If not, we'll call another function that runs a database query.
private function _get_data( $query) {
    return
    ( get_transient( $query ) ) ?
    get_transient( $query ) :
    $this->_get_query( $query );
}

// After you make the query, set the transient so you can leverage on caching plugins.
private function _get_query( $query ) {
  // Database logic. Results go to $results.
  ...
  set_transient( $query, $results , 0 ); // 0 Means cache for as long as you can.
}

3

当您从Facebook,Twitter等外部来源获取数据时,Transients API确实非常有用。

为了更清楚地了解什么是Transients API,以及与Cache WordPress函数的区别是什么,我建议观看WordCamp San Francisco 2011的 Otto和Nanic的演讲

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.