使用瞬变API的最佳实践

时间:2013-09-03 作者:soul

我最近在Wordpress中遇到了Transients API,希望能提高我正在编写的插件的性能。

基本上,该插件将亚马逊产品广告API中的产品详细信息存储在数据库中。产品详细信息使用数组的json编码表示进行存储。

现在,我尝试使用transients API,以便每当管理员清除数据库记录时,它也会使用transients API进行更新。

我目前正在使用set_transient 方法类似这样:

$data = array(
 \'123\' => "{\'title\' : \'\', \'price\' : \'\', \'brand\' : \'\'}"
 \'456\' => ...
);

$value = json_encode($data);
set_transient(\'amazon_items\', $value, 60 * 60);
然后我用get_transient

$asin = \'123\';
$data = json_decode(get_transient(\'amazon_items\'), true);
print_r($data[$asin]);
这样可以吗?还是应该将其存储在数组形式中,这样我就可以直接访问它,而无需使用json_decode? 我的用例是可以接受的,还是过度使用了?我还能改进这个吗?对于使用瞬态API可以存储的数据量是否有特定限制?在这个特定的用例中,我预计数据量将超过50Mb。

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

这样可以吗?还是应该将其存储在数组中,这样我就可以直接访问它,而不必使用json\\U解码?

在您的情况下,直接存储是指将其序列化存储。因为$data 是数组,不能按原样存储,但已转换为字符串。

即使您直接访问它,如:

$data = get_transient(\'amazon_items\');
print_r( $data[0] );
theget_transient 函数取消序列化幕后的值(就像set_transient 在幕后序列化),使用WPmaybe_unserialze 使用serialize php函数。

所以使用json_encode/json_decode 或者使用标准的php序列化方法有一些区别,但性能几乎相同。做过测试的人说json_encode 速度快一点。

您必须选择的方法取决于您对数据的处理方式:如果您计划使用js(甚至使用php以外的其他语言)来操作数据,那么正确的选择很可能是json。

如果必须序列化php对象,则必须使用php序列化来维护原始类:

$a = new MyClass;
$b = json_encode($a);
$c = json_decode($b);
$test = is_a($c, \'MyClass\'); // false

$a = new MyClass;
$b = serialize($a);
$c = unserialize($b);
$test = is_a($c, \'MyClass\'); // true
对于使用瞬态API可以存储的数据量是否有特定限制?

瞬态API使用{$wpdb->prefix}_options 保存数据。在此表中option_value 存储数据的列是longtext 可以theoretically contain 4Gb of data. 即使实际空间更少,50Mb也不会带来任何问题(当然,如果服务器中的db空间足够大的话)。

旁注:在处理序列化数据(json或php没有区别)时,您应该知道,运行任何类型的SQL查询都几乎不可能使用它们几乎可以了LIKE %..% 查询

SO网友:Otto

我不会暂时储存50多兆欧。我会考虑以某种方式将其存储在文件系统中,或者创建自己的特定db表来存储数据。

考虑一下,如果您正在将瞬态存储在数据库中,那么每次提取它时,必须将50兆的数据从DB发送到Web服务器进行处理。PHP必须分配50兆内存来保存它。等等你每次都在用那50毫克吗?不那就是浪费和愚蠢。

分解数据。不要将其视为一个大blob,而是将其存储在自己的表中,或存储为自己的post类型,或其他类型。使用键访问它,并且只访问您需要的部件。您将看到速度方面的好处,并可以通过这种方式使用更好的代码库。

结束

相关推荐

运行flush_all时对象高速缓存(作为后端的Memcached)和wPMU的问题

我正在运行一个相当大的wpmu设置bloggersdelight。dk-在站点上进行更改时,我们有时需要重置对象缓存。当我们这样做的时候,事情就会一团糟。来自站点的选项值混合在一起,博客的homeURL重定向到错误的博客等。这是当前对象缓存。我正在使用php。http://pastebin.com/QgM5tR9n正如您所知,flush函数的创建方式不允许在多站点时进行刷新。这是wordpress上找到的插件的默认设置。组织。为了刷新博客缓存,我需要做一些“有趣”的事情,比如:switch_to_blog