首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用外部API一次并缓存它

调用外部API一次并缓存它
EN

Stack Overflow用户
提问于 2016-01-13 10:34:50
回答 1查看 1.1K关注 0票数 1

我正在使用第三方API的飞行数据使用卷曲呼叫。在进行curl调用之后,我解析数据并将其插入数据库中进行缓存。(API调用不是免费的)

每当多个用户在同一时间对同一航班发出相同请求时,它都会多次调用外部API,因为使curl调用解析数据并插入到db中需要一些时间。因此,所有请求都检查db,意识到它不在其中,并开始调用外部API。当完成时,它会意识到它已经拥有飞行数据并停止进行db插入调用。

如何使用最佳实践来防止这种情况发生?

代码语言:javascript
复制
    $flightnum = $_POST['flightnum'];
    if (isFlightInDB($flightnum))
        return json_encode (getFlightFromDb ($flightnum));
    else {
        $flight = callFlightApiAndCache($flightnum);
        return json_encode($flight);
    }
EN

回答 1

Stack Overflow用户

发布于 2016-01-13 11:40:29

这里的简单工作流程是记住API上的请求已经发出了。如果您使用Node.js,它将非常简单,因为Node.js是一个单一应用程序,所有请求都将在该单个实例上运行,因此您可以有一个数组,在该数组中可以存储当前正在执行的所有API请求,并实现一些逻辑来等待结果、从数据库读取或执行that调用。

主要问题是,查询将由PHP在单独的服务器线程中执行,而将查询存储在数据库或本地文件中的速度太慢,无法保证您不会多次执行API调用。

但是,PHP中有一个API,允许您在PHP执行线程之间共享一个数组。看看shm_put_var() / shm_get_var()。这样的想法是:

  • 您从客户端获得一个查询。
  • 使用shm_get_var()获取共享数组
  • 如果尚未出现,则立即存储API查询,以阻止进一步的调用。
    • 如果已经存在:要么等待DB条目出现,要么返回DB条目,删除共享数组记录->,然后退出。

  • 如果DB有条目,检查它:返回DB条目,删除共享数组记录->,然后退出。
  • 执行API调用,并将结果存储在DB中。
  • 删除共享数组记录
  • 出口
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34764353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档