如何缓存外部json请求?

时间:2014-02-16 03:40:57

标签: jquery ajax json wordpress

在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文件的响应)?

1 个答案:

答案 0 :(得分:4)

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

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

你可能想要利用一些WordPress的内置功能,特别是包括:

<强> WP_Http 这是WordPress'漂亮的内置HTTP库,您可以使用它与API通信。

Transients 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;
}

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

谈论效率!

当然我也建议为此实现一个类实现,这样你就可以使用实例变量而不是全局变量来存储数据,但这只会让人感到厌烦。

希望有所帮助!