简单自定义插件中的瞬变不会像预期的那样到期

时间:2016-04-08 作者:Collin Barrett

我开发了一个简单的短代码插件,它从短代码中提供的url获取txt文件,并解析其中的特定数据段(文件上次修改的日期)。我正在尝试使用WP瞬态将解析的数据缓存24-48小时,然后再重新获取txt文件。我的代码用于对文件的第一次调用,解析后的数据成功地存储在瞬态中,但瞬态似乎永远不会过期,因此可以提取新数据。这是我第一次尝试使用瞬态,所以如果我遗漏了一些愚蠢的东西,我深表歉意。

我正在使用redis对象缓存,但即使禁用redis,瞬态似乎也不会过期。我可以强制更新的唯一方法是更改站点的redis缓存键(这样它实际上会看到一个空缓存)。所以,我认为缓存不是问题,但它可能是。。。

完整代码已打开GitHub here, 但是(我认为)帮助我解决这个bug的相关代码复制如下。

    // wp shortcode [lastmodified url="url-value"]
    function lastmodified_func( $atts ) {
        $a = shortcode_atts( array(
            \'url\' => \'\',
        ), $atts );
        return filemtime_remote( $a[\'url\'] );
    }
    add_shortcode( \'lastmodified\', \'lastmodified_func\' );

    // check the last modified value of a url
    function filemtime_remote( $url ) {
      $moddate = get_transient( \'mod_\' . esc_url( $url ) );
      // if list date is due for refresh and max date refreshes for this page request have not been reached
      if( false === $moddate ) {
        $list = file_get_contents( $url , null , null , 0 , 480 );

        // parsing code omitted on stackexchange for brevity

        // set random transient timeout between 24 and 48 hrs
        $timeout = mt_rand( DAY_IN_SECONDS , DAY_IN_SECONDS * 2 );
        // set transient for url updated date
        set_transient( \'mod_\' . esc_url( $url ), $moddate , $timeout );
      }
      return $moddate;
    }

1 个回复
SO网友:Mark Kaplun

不清楚到底是什么错了,但很少有人评论你做错了什么

临时缓存一段时间内的值,因此您的随机游戏实际上完全没有意义,尤其是在不经常获取url的情况下,因为您使用redis,当需要向其添加新值时,该值可能会作为内存清理的一部分过期。换句话说,某种程度上的随机性已经是使用瞬态的一部分,您的代码可能毫无意义。

选项名称最多可包含64个字符,这意味着对于长URL,您最终将得到以相同64个字母开头的URL的相同缓存值(实际上是由于临时前缀,甚至更少)。实际上,这可能是对将瞬态保存到DB的非redis实现的一个限制,但我会冒着极大的风险使用md5 或其他哈希函数,而不是转义URL。

使用一个更好的前缀来表示瞬态,mod太通用了,您的代码可能会与其他插件绑定。

相关推荐

Which cache is kicking

我一直在为一个从另一个开发者那里继承下来的网站而挣扎。我的主要问题是,我在模板的css文件中所做的更改并没有立即得到响应,这表明某种缓存正在发挥作用。我检查的是。这个。任何缓存指令的htaccess文件</任何可能被激活的缓存WordPress插件</主机实现的任何缓存功能</Cloudflare或任何其他CDN</我尝试了不同的浏览器和计算机,所以缓存是服务器端的您可以想象,上面的任何一项都没有启用,但我对css的更改需要几个小时才能看到。我在任何方面都不是WordPress专家