gpt4 book ai didi

PHP 防止同时执行函数(通过 PHP 进行限制)

转载 作者:行者123 更新时间:2023-12-03 12:56:13 26 4
gpt4 key购买 nike

我有一个通过 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;
}
}

但我真的没有看到其中的逻辑。

最佳答案

我相信您需要实现 semaphore .数据库可以工作,只要你能保证只有一个线程可以写入数据库然后发出请求。

例如,您可能对数据库使用更新请求,然后检查更新的行(以检查更新是否实际发生)。如果更新成功,您可以假设您获得了互斥锁,然后发出请求(假设时间合适)。像这样的东西:

$oldTime = $this->getTimeFromDatabase();
if ($oldTime < (time() - 2) && $this->getLock()) { // if its been 2 seconds
$this->setNewTimeInDatabase();
$this->releaseLock();
return true;
} else {
sleep(2);
return false;
}

function getLock()
{
return $mysqli->query('UPDATE locktable set locked = 1 WHERE locked = 0');
}

function releaseLock()
{
$mysqli->query('UPDATE locktable set locked = 0');
}

我不确定 mysql 函数,但我相信了解总体思路是可以的。

关于PHP 防止同时执行函数(通过 PHP 进行限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15121389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com