如何缓存外部 json 请求?

And*_*vey 2 ajax wordpress jquery json

在 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
  });
Run Code Online (Sandbox Code Playgroud)

jQuery 是否提供缓存这些请求的方法?或者我应该以某种方式在 WordPress 中处理这个问题(也许将响应写入服务器上的 JSON 文件)?

ado*_*nom 5

根据 API 和进行调用的上下文,您可以使用服务器来完成这些 API 调用,而不需要客户端来完成。执行前者意味着您可以通过数据库利用缓存,但这意味着服务器会承受更多压力,因为它现在完成所有请求。

如果不是特定于用户的信息,这可能才真正值得。也就是说,我非常支持在服务器端缓存任何涉及外部 Web 服务的内容。

您可能希望利用 WordPress 的一些内置功能,特别是包括:

WP_Http 这是 WordPress 漂亮的内置 HTTP 库,您可以使用它与 API 对话。

再次瞬态 API - 超级漂亮。允许您在本地数据库中存储和检索自过期数据。

一个快速的实现(未经测试,如果有问题请告诉我)如下:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后,您只需在代码中的任何位置调用 get_api_info() 即可检索所需的数据。如果您在同一个请求/脚本中多次调用该函数,它仍然只会向数据库大喊一次。如果您在 12 小时内在多个请求中调用该函数,它只会发送一次 API 请求。

谈效率!

当然,我也建议为此使用一个类实现,这样您就可以使用实例变量而不是全局变量来存储数据,但这只会变得挑剔。

希望有帮助!