我正在使用第三方API的飞行数据使用卷曲呼叫。在进行curl调用之后,我解析数据并将其插入数据库中进行缓存。(API调用不是免费的)
每当多个用户在同一时间对同一航班发出相同请求时,它都会多次调用外部API,因为使curl调用解析数据并插入到db中需要一些时间。因此,所有请求都检查db,意识到它不在其中,并开始调用外部API。当完成时,它会意识到它已经拥有飞行数据并停止进行db插入调用。
如何使用最佳实践来防止这种情况发生?
$flightnum = $_POST['flightnum'];
if (isFlightInDB($flightnum))
return json_encode (getFlightFromDb ($flightnum));
else {
$flight = callFlightApiAndCache($flightnum);
return json_encode($flight);
}发布于 2016-01-13 11:40:29
这里的简单工作流程是记住API上的请求已经发出了。如果您使用Node.js,它将非常简单,因为Node.js是一个单一应用程序,所有请求都将在该单个实例上运行,因此您可以有一个数组,在该数组中可以存储当前正在执行的所有API请求,并实现一些逻辑来等待结果、从数据库读取或执行that调用。
主要问题是,查询将由PHP在单独的服务器线程中执行,而将查询存储在数据库或本地文件中的速度太慢,无法保证您不会多次执行API调用。
但是,PHP中有一个API,允许您在PHP执行线程之间共享一个数组。看看shm_put_var() / shm_get_var()。这样的想法是:
https://stackoverflow.com/questions/34764353
复制相似问题