在 WordPress 主题中,我显示来自外部 JSON API 的信息。如何缓存这些数据以缩短页面加载时间。
我有一个 jQuery 函数
var url = 'http://my.api.com/'
$.getJSON(url)
.done( function(data) {
#display this data
})
.fail( function( jqXHR, textStatus, error) {
#handle errors
});
jQuery 是否提供了缓存这些请求的方法?或者我应该在 WordPress 中以某种方式处理这个问题(也许将响应写入服务器上的 JSON 文件)?
最佳答案
根据 API 和调用的上下文,您可以使用服务器来完成这些 API 调用,而不需要客户端来完成。执行前者意味着您可以通过数据库利用缓存,但这意味着服务器上的压力会更大,因为它现在正在完成所有请求。
只有当它不是特定于用户的信息时,这才可能真正有值(value)。也就是说,我非常支持对涉及外部 Web 服务的任何内容进行服务器端缓存。
您可能想要利用 WordPress 的一些内置功能,具体包括:
<强> WP_Http 这是 WordPress 漂亮的内置 HTTP 库,您可以用它来与 API 对话。
<强> Transients API 再说一遍 - super 漂亮。允许您在本地数据库中存储和检索自过期数据。
快速实现(未经测试,如果有问题请告诉我)如下:
define( 'HOURS', 60 * 60 );
function get_api_info( ) {
global $apiInfo; // Check if it's in the runtime cache (saves database calls)
if( empty($apiInfo) ) $apiInfo = get_transient('api_info'); // Check database (saves expensive HTTP requests)
if( !empty($apiInfo) ) return $apiInfo;
$response = wp_remote_get('http://my.api.com');
$data = wp_remote_retrieve_body($response);
if( empty($data) ) return false;
$apiInfo = json_decode($data); // Load data into runtime cache
set_transient( 'api_info', $apiInfo, 12 * HOURS ); // Store in database for up to 12 hours
return $apiInfo;
}
然后,您只需在代码中的任意位置调用 get_api_info() 即可检索所需的数据。如果您在同一请求/脚本中多次调用该函数,它仍然只会向数据库发出一次。如果您在 12 小时内多次请求调用该函数,它只会发送一次 API 请求。
谈论效率!
当然,我还建议为此使用一个类实现,这样您就可以使用实例变量而不是全局变量来存储数据,但这只是变得挑剔。
希望有帮助!
关于jquery - 如何缓存外部json请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21806992/