使用 Laravel 每天安排两次任务

Posted

技术标签:

【中文标题】使用 Laravel 每天安排两次任务【英文标题】:scheduling a task twice a day with Laravel 【发布时间】:2016-09-30 06:43:32 【问题描述】:

我正在尝试每天安排两次命令:

这是我的代码:

protected function schedule(Schedule $schedule)
    

        $morningCarbonHour = Carbon::now();
        $morningCarbonHour->hour = 23;
        $morningCarbonHour->minute = 27;
        $morningCarbonHour->second = 00;

        $hourIni = $morningCarbonHour->format('H:i');

        $nightCarbonHour = Carbon::now();
        $nightCarbonHour->hour = 23;
        $nightCarbonHour->minute = 28;
        $nightCarbonHour->second = 00;

        $hourFin = $nightCarbonHour->format('H:i');

        $schedule->command('check:time')
                 ->twiceDaily($hourIni,$hourFin)
                 ->timezone('America/Mexico_City');
    

我收到此错误消息:

[2016-05-31 23:29:01] production.ERROR: exception 'InvalidArgumentException' with message 'Invalid CRON field value 23:27,23:28 at position 1' in /home/forge/myproject/vendor/mtdowling/cron-expression/src/Cron/CronExpression.php:147

堆栈跟踪:

我真的不知道为什么???有什么想法???

【问题讨论】:

【参考方案1】:

twiceDaily 接受以小时为单位的参数。 默认值为public function twiceDaily($first = 1, $second = 13),这意味着任务将在每天的 1:00 和 13:00 执行。

您正在尝试运行使用此 (twiceDaily) 方法在技术上不可用的任务 23:27 和 23:28,因为它不接受分钟作为参数。


解决方案

twiceDaily() 更改为<command>->cron('27,28 23 * * *');。 它将在 23:27 和 23:28 运行你的命令。


或者,如果您想一天两次以不同的小时和分钟运行命令,您应该使用带有 dailyAt() 的两个单独的命令(一个命令上有两个 dailyAt(),将覆盖并且不会按您的意愿工作)。

【讨论】:

好的,我明白了。在实际情况下,获得 2 小时(初始化和结束)的算法有点棘手,所以,我不能像你说的那样做。它应该与 2 ->dailyAt('13:00'); 一起使用吗?还是第二个会覆盖第一个?基本上,这 2 个小时将是随机时间,例如:09:xx 和 19:xx 23:27 和 23:28 仅用于测试 两个dailyAt() 会覆盖自己。如果您必须坚持dailyAt(),唯一的解决方案是放置 2 个相同的命令,但执行日期不同。 哦哦。所以,2 dailyAt in 1 命令将覆盖,但我应该执行 2 个命令,应该没问题? @JuliatzindelToro 谢谢,我添加了关于dailyAt() 的部分。

以上是关于使用 Laravel 每天安排两次任务的主要内容,如果未能解决你的问题,请参考以下文章

Celerybeat 每天两次在不同时间安排任务

气流:任务调度间隔数秒,两次

如何安排 C# Windows 服务每天执行任务?

安排每天运行 2 次的任务 [重复]

安排任务每天在 eJabberd 服务器上运行?

在 C# .NET Web 应用程序中每天安排任务的正确方法