我应该在什么时候使用瞬变API?

时间:2012-03-09 作者:Michelle

我以前从未使用过Transients API,我想知道是否有人对何时使用它有指导。这个Codex article 这意味着作为一名主题开发人员,我可能希望设置每个新的WP_Query() 作为瞬态;我假设对于直接的$wpdb查询和query_posts(). 这是不是太过分了?和/或是否有其他我应该默认使用它的地方?

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

5 个回复
最合适的回答,由SO网友:Dwayne Charrington 整理而成

当您在主题和插件中进行复杂查询时,瞬态非常好。我倾向于在菜单和显示其他东西时使用瞬变,比如在侧边栏中显示推特上的推特。我绝对不会将它们用于任何事情,所以只会使用可以缓存的临时数据块。

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

Some uses for transients:

复杂的自定义数据库查询,Wordpress导航菜单,显示信息的边栏小部件,如:;推特、最近网站访问者列表或Flickr照片流缓存标签云This article 这是一个信息非常丰富的网站,它提供了快速的基准测试,显示了瞬变是如何加速你的网站的,甚至有几个例子。This other article 还有一些使用瞬变的好例子,可以帮助您理解使用瞬变的目的。

SO网友:Rarst

WordPress中有几种缓存机制,它们的机制不同,具体取决于object cache (本地或非本地):

+-----------+-------------------------+---------------------+
|           |         Native          | Object cache plugin |
+-----------+-------------------------+---------------------+
| Option    | Persistent (database)   | N/A                 |
| Transient | Persistent (database)   | Persistent (varies) |
| Cache     | Non-persistent (memory) | Persistent (varies) |
+-----------+-------------------------+---------------------+
简而言之,这意味着transient始终是持久的(将在页面加载之间生存,而不是本地缓存),但如果提供了定制存储,它将使用定制存储(不同于选项)。

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

然而,灵活性带来了潜在的复杂性,它们有很多细微差别(例如名称长度的限制、有无过期的不同行为、缺少垃圾收集),这使得它们比看起来更复杂。

总体情况:

使用选项保存必须持久的内容使用瞬态缓存任何其他内容如果您对这三个方面都有很好的了解,并且知道缓存比其他缓存更适合用例(通常不会),请使用缓存

SO网友:Thomas

我认为Sterling的代码可以通过不调用get\\u transient函数两次来改进。而是将第一个结果存储在临时变量中。因为瞬态API背后的理念是速度;-)

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

SO网友:Sterling Hamilton

简短回答:你应该在你可以的时候/地方使用它。

详细回答:

瞬态API用于缓存。所以你想尽可能多地使用它。您可以编写一个函数来实现这一点。

这并不过分,如果处理得当,最终会变得非常优雅:

// 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.
}

SO网友:Mamaduka

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

为了更清楚地了解什么是瞬态API以及缓存WordPress函数的区别,我建议从WordCamp San Francisco 2011

结束

相关推荐

Transients API and multisite

我们正在使用Atlas HTML站点地图插件,该插件使用transients API缓存站点地图,调用如下:set_transient( \'dmac_html_sitemap\', $output, 60*60*24*7 ); 现在,我们还有一个多站点设置,我想知道瞬态存储在哪里,WP multisite是否将它们分开。它将选项分开,因为每个站点(博客)都有自己的DB表前缀(例如wp\\U 29\\U选项)。我在某个地方读到,瞬态可以用memcached存储,所以我猜后端存储是可插入的。这个问