瞬变VS Cron+自定义字段:缓存每个帖子的数据

时间:2011-12-01 作者:Manny Fleurmond

想了解我想提出的解决方案的一些意见:

我有一个粉丝插件,我正在为电视剧粉丝开发。插件附带的自定义贴子类型之一是发布类型,用于存储节目dvd版本上的数据。我储存的一些元数据是亚马逊使用其产品广告API提供的信息。我想缓存一些可用的定价数据,例如dvd的当前价格。

我曾想过使用瞬态,但从我所能说的来看,它们只不过是一层可湿性粉剂选项;他们太全球化了。我必须用一个指向某个帖子的命名方案创建许多瞬态。

另一种选择是使用自定义字段,但使用CRON API来更新它,我可以让一个CRON作业每小时更新所有自定义字段,或者为每个这样做的帖子创建一个CRON作业。

我的问题是,哪种解决方案在性能和方便性方面更实用?

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

我想我应该围绕自定义字段编写一个包装函数,如下所示:

function get_post_transient( $post_ID, $meta_key, $update_function ) {
    $current_value = get_post_meta( $post_ID, $meta_key, true );
    if ( is_array( $current_value ) && $current_value[\'expiration\'] < date(\'U\') )
        return $current_value[\'data\'];

    $new_value = call_user_function( $update_function, $post_ID );
    update_post_meta( $post_ID, $meta_key, $new_value );

    return $new_value[\'data\'];  

}
并将元另存为数组,格式如下:

array(
    \'expiration\' => //timestamp that this field exires
    \'data\' => // all the custom data you want to save.
);
您只需要让update函数返回相同的数组结构。我不知道这种方法是否比在瞬态中使用选项表有任何真正的好处,但对我来说,将post meta存储在posteta表中更有意义。

SO网友:sanchothefat

在使用API实现缓存时,我使用了瞬态路由。主要是因为它们是为它而设置的,并且易于使用。在表大小或查询方面没有太多问题。MySQL是为大型数据集而设计的。

我的方法是对传递给API的url和/或参数进行散列,并将其用作临时标识符。与API进行通信的函数首先检查瞬态,如果瞬态不存在或已过期,则继续执行常规API调用。与您所建议的post meta相比,这里的优势在于,我们正在检查的是一个表和键,因此速度很快,不需要循环或复杂的代码,仅在瞬态过期时调用API,并且在请求数据时调用API,这将减少您进行的API调用次数。

适用于我的flickr和MovieDB。组织插件。

SO网友:Otto

如果它连接到一个特定的帖子,那么它真的应该在Posteta中。出于速度和易用性的原因,我自己多次违反这一原则,但每次我都感到脏兮兮的。:)

我认为最好的方法是将数据和过期时间都存储在posteta中。与其每小时检查所有类型,不如只在查看时检查它们。主要好处:你可以懒散地做这件事!

示例:

在后视图中,元被拉入。如果是过期数据,则会显示过期数据,但在全局变量中的某个位置会保留一个设置(可能只存储post id),告诉代码的另一部分在页面显示结束时刷新该数据。

然后使用“关机”操作挂钩。在这里,您将检查该全局变量,如果某些帖子的数据需要刷新,您可以从amazon中提取数据并更新Posteta,并将过期时间提前一段时间。

真的,这是世界上最好的。帖子仍然显示得很快,您的浏览者无需等待来自亚马逊的新数据。页面完成后,amazon数据将被刷新。您只需刷新人们正在查看的数据,并且只在他们查看数据时刷新数据,从而最大限度地减少处理。

结束