【问题标题】:Is it possible to ensure that Laravel jobs actually run at round times?是否可以确保 Laravel 作业实际上在轮次运行?
【发布时间】:2020-03-29 13:05:20
【问题描述】:

我想精确地每 30 分钟执行一次某项工作,例如:

- 00:00
- 00:30
- 01:00
- ...
- 12:00
- 12:30
- 13:00
- ...

Kernel.php,我有这份工作……

$schedule->command('mycommand:sender')
            ->everyThirtyMinutes();

...在crontab,我有这个命令...

* * * * * cd /www/webapp && php artisan schedule:run >> /dev/null 2>&1

显然一切正常,但如果我停止服务或重新启动服务器,则Kernel 甚至Crontab 中的此说明是正确的,例如,服务器或服务可用,在“ 12:29”,我知道命令会“分分钟”执行,但是这些指令中的“某事”会知道下一次执行“应该”在 12:30 或现在的方式,将运行“30 分钟” " 12:29 之后,因此,12:59?

虽然看起来无关紧要,但我的系统中有任务,需要在这些“轮次”执行,因为任务“执行时间”决定了将执行的内容。

【问题讨论】:

    标签: laravel cron laravel-scheduler laravel-jobs


    【解决方案1】:

    改为添加 ->everyThirtyMinutes();

    cron("*/30 * * * *")
    

    这将从现在开始执行:

    2019-12-04 18:00:00
    然后在 2019-12-04 18:30:00
    然后在 2019-12-04 19:00:00
    然后在 2019-12-04 19:30:00
    然后在 2019-12-04 20:00:00

    【讨论】:

    • 感谢您的建议,我会尝试,但只有这样我才能更好地理解。所以,根据你的建议,那么 everyThirtyMinutes() 将始终每 30 分钟运行一次,但不是循环时间,但是 cron("*/30 * * * *") 必须具有不同的属性?
    【解决方案2】:

    为什么不让cron 每 30 分钟运行一次,而不是每分钟在 cron 中运行并检查 php 中的逻辑?

    0,30 * * * * cd /www/webapp && php artisan schedule:run >> /dev/null 2>&1
    

    【讨论】:

    • 这是另一种选择,但我还有其他任务,包括每 15 分钟一次和其他静态时间(总是在 8:30 和 22:30)。我害怕失去这些时间,因为在预期时间之外的执行,收到的信息不再重要。
    • 我认为这没有任何问题。最后cron 即将运行预定的作业。它运行得非常好和精确。容差可能只有几秒
    • 如果我在jobkernel 中更改任何内容,我将需要重新启动命令artisan queue:work --daemon,因为该命令在后台运行(php artisan queue:work --daemon --tries=0 > storage/logs/jobs_queue.txt &)
    • 不知道,因为我是系统管理员。但可能是的
    猜你喜欢
    • 2018-04-02
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多