【发布时间】:2013-02-13 19:24:52
【问题描述】:
我有一个通过 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个请求?是否有可能因为checktime()中$this->setNewTimeInDatabase()的未接调用,数据库中最后一次请求的时间不会改变?
谢谢!
更新:
我刚刚被告知使用循环可能会解决问题:
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;
}
}
但我并没有真正看到其中的逻辑。
【问题讨论】:
-
检查
www.server.com会不会更好? -
@Zaffy 我无权访问
www.server.com -
另一种选择是创建一个像队列一样工作的静态变量,然后在 2 秒后,队列中的下一个项目被发送到 server.com。这必须是一个静态变量,以便在您的类的所有实例之间共享
-
为什么不只缓存 2 秒 ttl 的响应?
-
@Crisp 我对每个请求都会得到不同的响应
标签: php multithreading concurrency call throttling