【问题标题】:How to cache an external json request?如何缓存外部 json 请求?
【发布时间】:2014-02-16 03:40:57
【问题描述】:

在 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 响应对所有用户都是相同的(即不传递任何变量),我想知道服务器端缓存是否是更好的选择?你怎么看?
  • 如果所有用户的响应都相似,那么服务器端缓存肯定是更好的选择。
  • 对在 wordpress 中执行此操作的最佳方式有何想法?

标签: jquery ajax json wordpress


【解决方案1】:

根据 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 请求。

谈效率!

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

希望有帮助!

【讨论】:

  • 感谢 adomnom,这正是我正在寻找的。您知道以这种方式可以存储在数据库字段中的最大大小是多少吗?我已经在上面实现了您的代码,通过检查数据库,我可以看到 api 响应正在写入正确的选项键,但我无法在页面上显示?我试过echo get_api_info。我做错了什么?
  • 忽略我之前关于显示错误的评论。我犯了一个愚蠢的错误。这是完美的,谢谢!
  • 任何关于最大字段大小的信息仍然值得赞赏。
  • 瞬态的最大字段大小取决于您的数据库架构,但默认情况下(除非您已更改),它设置为 LONGTEXT 类型,最多允许 4GB。
猜你喜欢
  • 2011-02-19
  • 2021-07-24
  • 2015-12-07
  • 2018-08-29
  • 1970-01-01
  • 2019-11-08
  • 2021-05-09
  • 1970-01-01
  • 2014-02-03
相关资源
最近更新 更多