问题描述

你会认为一个暂时的设定将在一定时间到期,直到那时才会存在。不幸的是,它似乎早已从数据库中消失,无论是测试还是生产。作为一个简单的例子来看这个行为,尝试:

<?php
/*
Plugin Name: Test transient
Description: Show transients bug
Version: 0.1
*/

add_action( 'wp_head', 'doAnAlert' );

function doAnAlert()
{
    if( !get_transient( 'my_messageDismiss' ) )
    {
        //Transient nonexistent or expired
        ?><script> alert("This alert should also show again in 24hr"); </script>
        <?php

        set_transient( 'my_messageDismiss', 'dismissed', 86400); //Set for a day
    }

}

那么我在 Transient API 中缺少什么呢?警报显示几小时后,不是一天之后。

最佳解决方案

长话短说

  • WordPress 部分的瞬态处理是坚实的,一切都很精确

  • 瞬态使用对象缓存代替 non-default 实现的数据存储

  • 这意味着一些 back-end 缓存系统摆脱了最近尚未被访问的缓存

  • 底线:它不是 WordPress 的错误,它只取决于你的 back-end 缓存的设置

您可以使瞬态更准确,但需要 back-end 缓存调整,如果您不知道自己在做什么,我不建议使用此功能,因此缓存可能会产生相反的影响。

但即使如此,也不要以为 100%的精确度。


来自 WordPress Codex

Everyone seems to misunderstand how transient expiration works, so the long and short of it is: transient expiration times are a maximum time. There is no minimum age. Transients might disappear one second after you set them, or 24 hours, but they will never be around after the expiration time.

你应该总是有一个倒退的方法。


为什么会发生?

WordPress only invalidates transients when attempting to read them (which has lead to garbage collection problems in the past). However, this is not guaranteed for other backends.

Transients use the object cache for non-default implementations. The really important part to note here is that the object cache is a cache, and absolutely not a data store. What this means is that the expiration is a maximum age, not a minimum or set point.

One place this can happen easily is with Memcache set in Least Recently Used (LRU) mode. In this mode, Memcache will automatically discard entries that haven』t been accessed recently when it needs room for new entries. This means less frequently accessed data (such as that used by cron data) can be discarded before it expires.

阅读更多从 this article,这是很好的解释。


缓存?

有很多不同的系统,但这里是一个 MySQL 数据库缓存通用的例子。我不知道如何有助于了解瞬态缓存,但我猜这不会伤害。

  • 来自每个不同查询的数据被缓存

  • 每个缓存的数据都会获得一个值 (更为复杂的查询==的值越高)

  • 这些值会减少 (如倒数计时器,如果你愿意)

  • 缓存系统会间隔检查这些值

  • 如果这些值中的任何值达到零,则该缓存将被破坏

  • 如果相同的查询再次运行,则值返回到初始值

那么你可以从中得出什么结论?没有任何意义来设定瞬态:

  • 太简单

  • 不常用

因为在大多数情况下这些都很快被破坏了。我希望这能给你一个更清晰的图片缓存一般如何工作。它优先于频繁和复杂的简单和很少使用的数据。

注意:在缓存解释中有很多概括,以使其易于遵循和理解。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。