PHP检查对其他服务器的请求是否正在运行

PHP检查对其他服务器的请求是否正在运行,php,mysql,database,api,request,Php,Mysql,Database,Api,Request,我正在开发一个使用API的应用程序。我每分钟只能向服务器发出2个请求。因此,我使用自己的服务器,每分钟获取数据2次,我的应用程序从我的服务器请求数据。 我的服务器上有一个数据库,用来存储我需要的数据。因此,如果用户需要在智能手机或平板电脑上显示数据,它会从我的服务器获取数据 我有一个PHP脚本,它检查数据库中的最新条目是否超过30秒,如果是,脚本将从API服务器获取当前数据并将其存储到数据库中 但是现在,如果有1000个用户,每个人都同时请求当前数据-脚本get被调用了1000次,如果我的数据库

我正在开发一个使用API的应用程序。我每分钟只能向服务器发出2个请求。因此,我使用自己的服务器,每分钟获取数据2次,我的应用程序从我的服务器请求数据。
我的服务器上有一个数据库,用来存储我需要的数据。因此,如果用户需要在智能手机或平板电脑上显示数据,它会从我的服务器获取数据

我有一个PHP脚本,它检查数据库中的最新条目是否超过30秒,如果是,脚本将从API服务器获取当前数据并将其存储到数据库中


但是现在,如果有1000个用户,每个人都同时请求当前数据-脚本get被调用了1000次,如果我的数据库中的数据超过30秒,它会从API服务器获取数据-只要当前数据在我的数据库中不可用,我的服务器是否会向API服务器发出请求?我担心我超过了每分钟2个请求

使用cron作业精确地每隔30秒从服务器中提取数据,并删除它对每个请求进行双重检查的部分。如果您已经有了一个cron任务,那么这是多余的

编辑

如果cron不是一个选项,您可以尝试使用文件锁

其思想是,当发出请求时,您对文件系统中的文件加上锁,并在请求完成后解除锁。每次发出请求时,检查文件是否已锁定,如果是,则表示当前有其他人正在触发请求,可以安全地跳过。如果文件已解锁,则可以在其中存储当前时间戳,并检查该时间戳是否早于30秒

// get current time by reading the file. You will need to create the file manually initially with the timestamp in it
$last_run = file_get_contents('foo.txt');

// open the file
$fp = fopen("foo.txt", "w");

// check if file is locked
if (flock($fp, LOCK_EX | LOCK_NB)) {

    // check that it's been more than 30 seconds
    if($last_run > (time() - 30)){

        // if file is unlocked update it with current timestamp
        $fwrite($fp, time());

        // make request to server, upload to db

        // after request has been made, unlock the file
        flock($fp, LOCK_UN);

    }

} else {

    // someone else is triggering the request, get data from db

}

“只要当前数据在我的数据库中不可用,我的服务器是否会向API服务器发出请求?”–这取决于你对整个事情的具体实现,你不认为吗…?也许你不应该(仅)存储当前数据的年代,而是上次触发对该API的新数据请求时?如果下一个脚本实例看到“好的,这个数据的最后一个请求是在五秒钟前触发的”…那么现在不要让它触发另一个请求。我的脚本只向服务器发出一个请求-在我得到响应后,我存储数据。但是我的服务器是否有1000个请求,我的服务器是否会向API服务器发出1000个请求?我现在不知道如何实现这一点:/应用程序服务器的调用方没有理由触发对保存源数据的服务器的请求。您应该取消这些活动的耦合。服务器正在运行Parallels-Plesk面板(v11.5.30),但我认为我没有创建cron作业的权限。。因此,在我的情况下,cron作业不是最佳解决方案。cron只能在1分钟的时间间隔内执行,因此,如果您想使用这种方法,您需要在脚本中构建一个计时器,在第一次请求后约30秒触发第二次请求。服务器正在运行Parallels-Plesk面板(v11.5.30),但我想我没有权限创建cron工作。。因此,在我的情况下,cron作业不是最佳解决方案。@MikeBrant或只是有两个cron作业每分钟运行相同的脚本,彼此相隔30秒。@beeef请求数据的频率超出允许范围会造成什么危害?您真的会遇到麻烦吗,还是API只是拒绝了请求?如果是后者,那么就依靠数据库中的数据。我想我可以提出任意多的请求,但是如果我整天都在做2个以上的请求,那么我的API密钥将不再有效,我需要一个新的(如果我得到一个的话)。只有当我的唯一API密钥有效时,我才能从服务器获得响应。但我不希望我的API密钥失效。