我有一个 Laravel 8 项目作为后端,部署在 ubuntu 的 EC2 上。我在特定时间安排了一些功能作为 cron 作业。但是,同一个 cron 作业似乎运行了多次。所以我放了一个测试函数如下。
$schedule->call(function () {
Log::info('function testing');
})->dailyAt('8:00')->timezone('Asia/Qatar');
上面的日志打印了大约39次。经过我的研究,我添加了 withoutOverlapping()
$schedule->call(function () {
Log::info('function testing');
})->dailyAt('8:00')
->timezone('Asia/Qatar')
->name('unique_event_name')
->withoutOverlapping();
上面打印了大约 9 次。
我有一个具有相同代码和类似
env
的开发服务器。在那里它工作得很好。它只运行一次。
* * * * * cd backend_path && php artisan schedule:run >> /dev/null 2>&1
上面的命令我在
crontab -e
上运行。
我无法找出我的生产服务器的问题,任何帮助将不胜感激!!
该解决方案涉及使用 Redis(一种高性能内存数据存储)来记录作业的完成情况并随后检查该作业的状态。其工作原理如下:
1。初始化Redis连接:
首先,我们初始化与 Redis 服务器的连接。您需要指定Redis服务器的主机、端口和数据库索引。此信息允许 Python 脚本与 Redis 交互。
2。记录作业完成:
log_job_completion
函数负责记录作业的完成情况。它需要 job_id
作为参数。
在函数内部,为 Redis 中的每个作业创建一个唯一的密钥。该键是使用 job_id
构建的,它有助于稍后识别作业的状态。
使用 Redis set
命令将作业的状态设置为“已完成”,将作业 ID 与其完成状态相关联。
3.检查工作状态:
check_job_status
功能允许您使用其job_id
检查作业的状态。
它首先创建与 log_job_completion
函数中使用的相同的唯一密钥。
然后它使用 exists
方法检查 Redis 中是否存在该密钥。如果该键存在,则意味着该作业已被记录。
如果该键存在且关联状态为“已完成”,则返回“作业已完成”。否则,它将返回“作业仍在进行中”。
如果该键不存在,则返回“未找到作业”,表示该作业尚未记录。
用法示例:
job_id
替换为您的特定职位标识符。log_job_completion
被调用来记录作业的完成情况。check_job_status
被调用来检查作业的状态,并且
结果被打印。当您想要跟踪各种作业或流程的完成状态时,此解决方案非常有用。通过将这些信息存储在 Redis 中,您可以轻松查询和监控作业的状态,这在作业可能在不同时间独立运行的分布式或异步系统中特别有价值。