我有一个功能,通过卷曲发送HTTP请求到www.server.comPHP防止同时执行功能(通过节流PHP限制)
我的任务是确保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()的调用?
谢谢!
UPDATE:
我刚才被告知,使用循环可能解决这个问题:
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 2013-02-27 20:11:00
@Zaffy我无法访问'www.server.com' – rinchik 2013-02-27 20:11:39
另一种方法是创建一个静态变量,它像一个que一样工作,然后在2秒钟后,来自que的下一个项目被发送到服务器。 COM。这必须是一个静态变量,因此它可以在你的类的所有实例中共享。 – Mike 2013-02-27 20:12:35