为什么会提前清除瞬变信号?

时间:2016-05-10 作者:NoBugs

您可能会认为,在某个时间过期的临时集将一直存在到该时间。不幸的是,无论是在测试还是在生产中,它们似乎都在较早地从数据库中消失。作为查看此行为的简单示例,请尝试:

<?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
    }

}
那么,关于瞬态API,我遗漏了什么呢?警报会在数小时后显示,而不是一天后。

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

TL;DR

<瞬态处理的Wordpress部分是可靠的,一切都非常精确。对于非默认实现,瞬态使用对象缓存而不是数据存储。这意味着一些后端缓存系统会删除最近未访问的缓存。底线是:这不是Wordpress的错误,这只取决于后端缓存的设置方式,您可以获得更精确的瞬态,但需要对后端缓存进行调整,如果您不知道自己在做什么,我不建议您这样做,过多的缓存可能会产生相反的效果。

But even then, don\'t assume that it is 100% precise.


发件人WordPress Codex:

每个人似乎都误解了瞬时过期的工作原理,所以它的长短是:瞬时过期时间是最长的时间。没有最低年龄。瞬态可能会在设置后的一秒钟或24小时内消失,但它们在过期后将永远不会出现。

你应该always 有一个后备方法。

<小时>

Why is it happening?!

WordPress仅在尝试读取瞬态时使其无效(这在过去会导致垃圾收集问题)。但是,对于其他后端,这并不能保证。

瞬态将对象缓存用于非默认实现。这里需要注意的真正重要的部分是,对象缓存是一个缓存,而绝对不是一个数据存储。这意味着到期时间是一个最大年龄,而不是一个最小值或设定值。

一个容易发生这种情况的地方是将Memcache设置为最近使用最少(LRU)模式。在此模式下,当Memcache需要空间容纳新条目时,它会自动丢弃最近未访问的条目。这意味着访问频率较低的数据(如cron数据使用的数据)可以在到期之前丢弃。

阅读更多信息this article, 解释得很好。

<小时>

Caching?

虽然有很多不同的系统,但这里有一个MySQL数据库缓存通常是如何工作的示例。我不确定理解瞬态缓存有多大帮助,但我想这不会有什么坏处。

缓存来自每个不同查询的数据每个缓存的数据都会得到一个值(更复杂的查询== 值越高)

  • 这些值越小(如果愿意的话,就像倒计时计时器一样)
  • 缓存系统每隔一段时间检查这些值。如果这些值中的任何一个达到零,缓存就会被破坏。如果再次运行相同的查询,值会返回到初始值。。你能从中得出什么结论?没有必要设置瞬态:

    太简单了,不经常使用,因为在大多数情况下,它们很快就会被破坏。我希望这能让您更清楚地了解缓存的工作原理。它将频繁和复杂的数据优先于简单和很少使用的数据。

    Note: 缓存解释中有很多概括,使其易于理解和理解。

  • 相关推荐

    Set Transient on CPT

    当我将set\\u瞬态代码添加到我的cpt查询时,我得到Fatal error: Call to a member function have_posts() on string ... on line 30第30行基本上是:if($graduate_student_query->have_posts()) : ?>如果没有set\\u瞬态,查询工作正常,但显然不是最佳实践。set\\U瞬态应该去哪里?<?php if ( false === ( $gradua