临时存储位置?数据库/xcache/w3总缓存?

时间:2015-01-09 作者:johnmontfx

我一直在努力通过利用瞬态来存储呈现的HTML来加速我的网站,效果非常好。我已经设置了检查,可以在post/page/data更新时清除特定的瞬态,而且一切都很好。我有一些复杂的db检查,所以它确实加快了速度。

但我在提出过渡期的全面管理时遇到了一个绊脚石。例如,如果我更改主题模板,我希望能够删除多个瞬态,以便自动重新生成它们。在少数情况下,我只有五个不同的瞬态,所以很容易循环通过它们。但在其他片段中,我有100多个变体。

在基本级别上,瞬态可以存储在数据库中,即使使用通配符搜索,也很容易搜索和找到。但是,它们并不总是存储在数据库中。但它们存放在哪里?我使用了xcache php操作码缓存器,但在xcache变量列表中似乎没有使用它们。我也使用W3 Total Cache,但即使关闭了对象缓存(或禁用了插件),我似乎也不知道它们存储在哪里。

我的想法是,我希望能够对它们进行通配符搜索,例如“myprefix\\uuux”,然后删除所有匹配项,而不是试图单独删除每个瞬态(这总是很好)。有了db,我可以做到。。。这里有很多这样的例子。但我不知道瞬变在哪里。。。如果它们不在数据库中。。我在xcache管理中没有看到它们。

感谢您的任何见解。。

2 个回复
SO网友:Rarst

通常,在瞬态情况下,您不使用存储。您可以使用Transients API,该API使用数据库或对象缓存。

对象缓存实现是任意的,任何人都可以使用后端来工作。

因此,由于底层对象缓存中没有大容量删除(某些后端无法执行此类操作),因此有效地存在大容量删除瞬态的方法。

对于公共解决方案,您必须以在这些约束范围内运行的方式设计缓存逻辑。

常见的技术之一是在瞬态密钥中包含某种标识符,因此更改标识符可以有效地使“旧”集无法访问。但要注意键的长度限制。

SO网友:Nathan Johnson

WordPress将瞬态存储在数据库的选项表或全局wp\\u object\\u cache对象中,这需要键值后端(感谢Rarst的澄清)。它首先检测是否存在缓存对象,如果存在,则使用该对象。如果缓存对象不存在,则它会返回到数据库。

在不知道是否启用的情况下,我们不知道WordPress将在哪里存储瞬态。在很多情况下,这并不重要,但如果您想像现在这样获得所有带有前缀的瞬态,这可能会很困难。如果您知道瞬态存储在数据库中,那么构造一个SQL查询来获取瞬态就很简单了。问题在于缓存对象。

一种解决方案是将所有主题/插件瞬态存储在一个数组中。然后使用WordPress transients API将值存储在数据库或对象缓存中。

包装器类

/**
 * Class to store all theme/plugin transients as an array in one WordPress transient
 **/
class wpse_174330_transient {
  protected $name;
  protected $transient;

  public function __construct( $name ){
    $this->name;
    $this->transient = ( false !== ( $t = get_transient( $name ) ) ) ? $t : [];
  }
  public function all(){
    return $this->transient;
  }
  public function flush(){
    $this->transient = [];
    delete_transient( $this->name );
  }
  public function set( $transient, $value, $expiration = \'\' ){
    $this->transient[ $transient ] = $value;
    $this->update();
  }
  public function get( $transient ){
    return isset( $this->transient[ $transient ] ) ?
      $this->transient[ $transient ] : false;
  }
  public function delete( $transient ){
    unset( $this->transient[ $transient ] );
    return $this>update();
  }
  protected function update(){
    return set_transient( $this->name, $this->transient );
  }
}
用法
$theme_transients = new wpse_174330_transient( \'wpse_174330\' );
$theme_transients->set( \'header_color\', \'blue\' );
$theme_transients->get( \'footer_color\' );

//* Delete all the transients
foreach( $theme_transients->all() as $name => $value ){
  $theme_transients->delete( $name );
}

//* Flush \'em
$theme_transients->flush();

结束

相关推荐

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存储,所以我猜后端存储是可插入的。这个问