2016-01-13 56 views
0

我正在使用第三方API来使用卷曲调用的飞行数据。 (API调用不是免费的)调用外部API一次并缓存它

当多个用户同时对同一个航班提出同一请求时,它会调用外部API多次,因为它需要一些时间才能使curl调用解析数据,然后插入到数据库中。 所以所有的请求都检查数据库,意识到它不在那里,并开始调用外部API。完成后,它意识到它已经有飞行数据并停止进行数据库插入调用。

如何使用最佳实践来防止此问题?

$flightnum = $_POST['flightnum']; 
    if (isFlightInDB($flightnum)) 
     return json_encode (getFlightFromDb ($flightnum)); 
    else { 
     $flight = callFlightApiAndCache($flightnum); 
     return json_encode($flight); 
    } 
+0

你可以先搜索用户请求'DB'若发现则显示结果,否则打电话给你的api – urfusion

+0

你不读我的问题,它是关于多个请求和时间 – Mazzy

+0

对不起。我的坏.. – urfusion

回答

1

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

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

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

  • 从客户端
  • 得到查询你的共享使用数组shm_get_var()
  • 您存储API查询正确的路程,如果不存在,以阻止进一步的呼叫。
    • 如果已经存在:或者等待数据库条目出现或返回数据库条目,删除共享数组记录 - >然后退出。
  • 检查数据库是否有条目:返回数据库条目,删除共享数组记录 - >然后退出。
  • 执行API调用,并把结果存储在数据库中
  • 删除共享阵列记录
  • 出口