如果正在使用外部对象缓存,则清除缓存的插件数据

时间:2017-08-25 作者:Jonathan Stegall

我创建了一个插件,它可以缓存它使用的一些数据,主要是Salesforce REST API调用结果,并每隔一段时间(默认每24小时)过期一次。

插件调用以下方法来控制缓存:

/**
 * Check to see if this API call exists in the cache
 * if it does, return the transient for that key
 *
 * @param string $url The API call we\'d like to make.
 * @param array  $args The arguents of the API call.
 * @return get_transient $cachekey
 */
public function cache_get( $url, $args ) {
    if ( is_array( $args ) ) {
        $args[] = $url;
        array_multisort( $args );
    } else {
        $args .= $url;
    }
    $prefix = esc_sql( $this->transient_prefix() );
    $cachekey = $prefix . md5( wp_json_encode( $args ) );
    return get_transient( $cachekey );
}

/**
 * Create a cache entry for the current result, with the url and args as the key
 *
 * @param string $url The API query URL.
 * @param array  $args The arguments passed on the API query.
 * @param array  $data The data received.
 * @param string $cache_expiration How long to keep the cache result around for.
 * @return Bool whether or not the value was set
 * @link https://developer.wordpress.org/reference/functions/set_transient/
 */
public function cache_set( $url, $args, $data, $cache_expiration = \'\' ) {
    if ( is_array( $args ) ) {
        $args[] = $url;
        array_multisort( $args );
    } else {
        $args .= $url;
    }
    $prefix = esc_sql( $this->transient_prefix() );
    $cachekey = $prefix . md5( wp_json_encode( $args ) );
    // Cache_expiration is how long it should be stored in the cache.
    // If we didn\'t give a custom one, use the default.
    if ( \'\' === $cache_expiration ) {
        $cache_expiration = $this->options[\'cache_expiration\'];
    }
    return set_transient( $cachekey, $data, $cache_expiration );
}

/**
 * Get the cache transient prefix for this plugin and return it
 *
 * @return The transient prefix
 */
private function transient_prefix() {
    $transient_prefix = \'sfwp\';
    return $transient_prefix;
}

/**
 * If there is a WordPress setting for how long to keep this specific cache, return it and set the object property
 * Otherwise, return seconds in 24 hours
 *
 * @param string $option_key The cache item to keep around.
 * @param int    $expire The default time after which to expire the cache.
 * @return The cache expiration saved in the database.
 */
public function cache_expiration( $option_key, $expire ) {
    $cache_expiration = get_option( $option_key, $expire );
    return $cache_expiration;
}
我想为用户提供一种手动清除此缓存的方法,以防他们更改Salesforce对象的配置,并且不想等待自动过期。我希望避免在这次事件中清除整个站点的缓存(这是我对wp_cache_flush() 可以)。

我刚刚添加了$transient_prefix 在上面的方法中,我意识到如果站点只使用Transients API,这将很容易。但如果他们使用的是对象缓存,我就不行了。

我创建了一个cache_purge 方法如下:

/**
 * Create a cache entry for the current result, with the url and args as the key
 *
 * @param string $subset If we only want to purge WordPress data, Salesforce data, options, etc.
 * @return Bool whether or not the purge was successful
 */
public function cache_purge( $subset = \'\' ) {
    $prefix = esc_sql( $this->transient_prefix() );

    // cache is stored somewhere other than the options table
    if ( wp_using_ext_object_cache() ) {

    } else {
        // cache is stored in the options table. this is pretty easy.
        $options = $this->wpdb->options;
        $t = esc_sql( \'_transient_timeout_\' . $prefix . \'%\' );
        $sql = $wpdb ->prepare( "SELECT option_name FROM $options WHERE option_name LIKE \'%s\'", $t );
        $transients = $this->wpdb->get_col( $sql );
        foreach ( $transients as $transient ) {
            // Strip away the WordPress prefix in order to arrive at the transient key.
            $key = str_replace( \'_transient_timeout_\', \'\', $transient );
            // Now that we have the key, use WordPress core to the delete the transient.
            delete_transient( $key );
        }
    }
}
我的理解是,这将允许我检查是否存在任何外部对象缓存(我认为这将包括缓存插件,以及Varnish/memcache等),如果没有,请清除transients API。

到目前为止我说的对吗?如果是这样,我该如何从对象缓存中清除相同的数据?

1 个回复
SO网友:birgire

我们注意到,当我们使用object-cache.php 拖放文件。

例如,如果wp_using_ext_object_cache() 退货true, 然后

get_transient( $transient ) 
-> wp_cache_get( $transient, \'transient\' )

set_transient( $transient, $value, $expiration ) 
-> wp_cache_set( $transient, $value, \'transient\', $expiration )

delete_transient( $transient ) 
-> wp_cache_delete( $transient, \'transient\' )
团队所在位置transient.

对象缓存API不支持wp_cache_delete_group() 要按组删除缓存,并且组当前在票证中有一个wontfix#4476.

给出的原因是,并非所有持久缓存解决方案都支持它。但票证中描述了一些依赖于缓存解决方案的方法。

例如WP Redis 持久对象缓存实现支持wp_cache_delete_group(), 但不是Memcached Object Cache 实施

如果我们在插件中使用具有持久对象缓存的瞬态,那么我们应该注意,如果我们使用:

if( function_exists( \'wp_cache_delete_group\' ) )
{
    wp_cache_delete_group( \'transient\' );
}
然后,看起来我们将刷新所有瞬态,而不仅仅是我们自己插件中设置的瞬态。

如果缓存密钥事先已知,那么我们可以删除具有以下内容的缓存密钥:

wp_cache_delete( $cachekey, $cachegroup );
在哪里$cachegroup\'transient\' 如果我们使用瞬态。

结束

相关推荐

无法打开Advanced-cache.php,这将破坏媒体库

在我的WordPress安装中,它是3.8版本,所有插件都已更新,它使用的是Magic Fields 2和Hypercache等插件。我无法在帖子中插入图像,因为当我上传时,它会给我一个错误:上载时出错。请稍后再试。帖子“插入媒体”中的媒体库窗口显示为空白,尽管我知道那里有图像,可以通过侧边栏中的查看它们。当我尝试插入带有魔术字段的图像时,当我单击“插入帖子”时,窗口是空白的,它不会插入图像。在wp配置中。php,我已将调试设置为true:define(\'WP\\u DEBUG\',true);我在禁用