PHP:如何防止多次执行代码(如果代码已经在处理中)
解释
通常需要 10-20 秒才能响应的 API 调用(对另一个服务)存储在数据库中,
存储后,系统将尝试立即使用API向用户显示结果,但它可能会失败(并显示它失败,但我们将自动重试),因此还有一个设置为每30秒运行一次并再次尝试(失败)查询。Cron Job
如果 API 返回成功(无论是在即时使用还是使用 Cron Job),则该标志在数据库中更改为成功,并且不会再次运行。
问题
我的问题是,当 to API 正在处理时,可能还会尝试另一个调用,因为它尚未标记为成功,Instant Call
Cron Job
同样在极少数情况下,当上一个 Cron 作业正在处理中时,下一个 Cron 作业可能会再次运行代码。
我已经尝试过防止问题的原因
我尝试将API调用存储在数据库表中,并在API调用成功时将其删除,或者如果失败,则将状态设置为0,In Process
Status=1
if ($status === 0)
{
// Set Status to 1 in Database First (or die() if database update failed)
// Then Call The API
// If Failed Set Status to 0 so Cron Job can try again
// If Successful Change Flag to success and remove from queue
}
但是,如果和同时发生呢?它们都检查状态是否为0,然后都将状态设置为1并执行API调用...
Instant Call
Cron Job Call
问题
-
我尝试过的正确处理方法是什么?
-
如果有很多电话(有时+500 /秒),我应该担心它们发生在确切的时间(我在上面的黄色报价中解释的问题)
赏金前更新
在PHP方面,真的没有一种简单的方法来处理这种情况吗?如果不是,在专家看来哪种方式更好?以下是一些方法,但没有一个足够详细,也没有一个有任何下议/赞成票。
附言:数据库有很多更新/插入,我不认为锁定是一个有效的想法,我不确定其他想法。