我有一个通过 CURL 向 www.server.com 发送 HTTP 请求的函数
我的任务是确保 www.server.com 每 2 秒收到不超过一个请求。
可能的解决方案:
创建一个函数checktime()
,将当前调用时间存储在数据库中,并在每次下一次调用时检查数据库,并使系统暂停 2 秒:
$oldTime = $this->getTimeFromDatabase();
if ($oldTime < (time() - 2) ) { // if its been 2 seconds
$this->setNewTimeInDatabase();
return true;
} else {
sleep(2);
return false;
}
问题/问题:
可以说,对 www.server.com 的最后一次请求是在 1361951000 上。然后其他 10 个用户尝试在 1361951001 上进行请求(1 秒后)。checktime()
函数将被调用。
因为它只有 1 秒,所以该函数将返回 false。所有 10 个用户将等待 2 秒。是不是意味着1361951003上会同时发送10个请求?并且是否有可能由于 $this->setNewTimeInDatabase() 中未接来电,数据库中最后一次请求的时间不会改变checktime()
?
谢谢!
更新:
我刚刚被告知使用循环可能会解决问题:
for($i=0;$i<300;$i++)
{
$oldTime = $this->getTimeFromDatabase();
if ($oldTime < (time() - 2) ) { // if its been 2 seconds
$this->setNewTimeInDatabase();
return true;
} else {
sleep(2);
return false;
}
}
但我真的没有看到其中的逻辑。