我最近在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。
最合适的回答,由SO网友:gmazzap 整理而成
这样可以吗?还是应该将其存储在数组中,这样我就可以直接访问它,而不必使用json\\U解码?
在您的情况下,直接存储是指将其序列化存储。因为$data
是数组,不能按原样存储,但已转换为字符串。
即使您直接访问它,如:
$data = get_transient(\'amazon_items\');
print_r( $data[0] );
the
get_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 %..%
查询序列化/反序列化的过程有点昂贵,尤其是对于大数据而言。因此,它可能(实际上)很有用,但请尽量减少此类调用的频率,如果可能,一旦检索到值,请尝试以某种方式缓存它