gpt4 book ai didi

cron 作业中的 PHP 脚本是双重处理

转载 作者:行者123 更新时间:2023-11-29 04:09:08 25 4
gpt4 key购买 nike

我有 5 个运行 PHP 文件的 cron 作业。 PHP 文件在 MySQL 数据库中检查需要处理的项目。由于 cron 同时启动所有脚本,似乎有些项目被处理了两次,有时甚至多达五次。

在其中一个脚本中选择文件后,它会立即发送更新查询,这样其他作业就不会再次运行它。不过看起来还是双处理。

如何防止其他脚本处理之前由其他 cron 作业选择的项目?

最佳答案

这个问题称为“竞争条件”。在这种情况下,它的发生是由于 SELECT 和 UPDATE,虽然一个接一个地调用,但不是一个单一的操作。因此,有可能两个作业执行 SELECT 相同的作业,然后第一个执行 UPDATE,然后第二个执行 UPDATE。所以他们继续同时运行这项工作。

但是,有一个解决方法。你可以在你的表中添加一个字段,其中包含当前 cron 作业 worker 的 ID(如果你在一台机器上运行它,它可能是 PID)。在 worker 中,您首先执行 UPDATE,尝试为其保留工作:

UPDATE jobs 
SET worker = $PID, status = 'processing'
WHERE worker IS NULL AND status = 'awaiting' LIMIT 1

然后您确认您已成功为该工作人员保留工作:

SELECT * FROM jobs WHERE worker = $PID

如果它没有返回给你一行,这意味着其他工作人员首先保留了它。您可以从第 1 步开始重试以获取另一份工作。如果它确实返回了一行,则您将进行所有处理,然后最后进行最终更新:

UPDATE jobs 
SET status = 'done', worker = NULL
WHERE id = $JOB_ID

关于cron 作业中的 PHP 脚本是双重处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18031244/

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