Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 调用一次外部API并缓存它_Php - Fatal编程技术网

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

Php 调用一次外部API并缓存它,php,Php,我正在使用第三方API,通过curl调用获取飞行数据。 在进行curl调用之后,我解析数据并将其插入到数据库中进行缓存。(API调用不是免费的) 每当多个用户同时对一个航班发出相同的请求时,它就会多次调用外部API,因为curl调用解析数据然后插入数据库需要一些时间。 因此,所有请求都会检查数据库,意识到它不在其中,然后开始调用外部API。当完成时,它意识到它已经有了飞行数据,并停止进行db insert调用 我如何使用最佳实践来防止这种情况 $flightnum = $_POST['f

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

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

我如何使用最佳实践来防止这种情况

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

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

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

然而,PHP中有一个API,允许您在PHP执行线程之间共享一个数组。看看shm\u put\u var()/shm\u get\u var()。我们的想法是:

  • 您从客户机获得一个查询
  • 使用shm_get_var()获取共享数组
  • 如果尚未出现API查询,则立即存储该查询以阻止进一步调用。
    • 如果已经存在:等待DB条目出现或返回DB条目,删除共享数组记录->然后退出
  • 检查数据库是否有条目:返回数据库条目,删除共享数组记录->然后退出
  • 执行API调用,并将结果存储在数据库中
  • 删除共享阵列记录
  • 出口

您可以先在
DB
中搜索用户请求,如果找到,则显示结果,否则请致电您的API。您没有阅读我的问题,这是关于多个请求和时间的问题。请显示您当前的代码(或其简化版本)-我可以想出一些方法来处理此问题,但没有猜测的必要。还有,这真的经常发生吗??如果不是的话,你最终可能会给你的代码库增加一些复杂性,如果有的话。为什么没有一个后台工作来检查表中的数据并进行api调用,而不是由用户触发的相同进程?这是一个阻塞进程,我不能在api调用中返回任何内容