Php 在Laravel中调度多个cron

Php 在Laravel中调度多个cron,php,laravel,cron,Php,Laravel,Cron,我正在尝试在不同的时间在Laravel运行多个作业 protected function schedule(Schedule $schedule) { $schedule->command('emails:send') ->dailyAt('08:00'); $schedule->command('emails:evening-status') ->dailyAt('17

我正在尝试在不同的时间在Laravel运行多个作业

protected function schedule(Schedule $schedule)
{
        $schedule->command('emails:send')
                 ->dailyAt('08:00');

        $schedule->command('emails:evening-status')
                 ->dailyAt('17:00');

        $schedule->command('email:weekly-report')
                 ->weekly()->mondays()->at('08:00');
}
这里的问题是,只有第一个命令-
emails:send
-起作用。其他命令在指定的时间不起作用。但是,当我手动运行它们时,它们工作正常


我遗漏了什么?

如果第二个comand不工作:

$schedule->command('emails:evening-status')
             ->dailyAt('17:00');

您只能在某个文件(如“test.txt”)中插入一行打印当前日期的代码,然后在创建文件时签入所需时间。若创建了文件,则可以断定计划的脚本中的代码有问题。

使用队列进行作业处理

在cron上,将所有作业添加到队列


运行多个队列工作程序

您可以尝试以下代码:

protected function schedule(Schedule $schedule)
{
        $schedule->command('emails:send')
                 ->dailyAt('08:00')->withoutOverlapping();

        $schedule->command('emails:evening-status')
                 ->dailyAt('17:00')->withoutOverlapping();

        $schedule->command('email:weekly-report')
                 ->weekly()->mondays()->at('08:00')->withoutOverlapping();
}
以上代码只是执行,没有重叠。你可以了解更多关于


如果您仍然面对相同的问题,请告诉我。

如果您需要使用Laravel计划,请使用此代码

    $schedule = new Schedule();
    $schedule->command('emails:send')
             ->dailyAt('08:00')->withoutOverlapping();

    $schedule = new Schedule();
    $schedule->command('emails:evening-status')
             ->dailyAt('17:00')->withoutOverlapping();

    $schedule = new Schedule();
    $schedule->command('email:weekly-report')
             ->weekly()->mondays()->at('08:00')->withoutOverlapping();

但可能这种方式是错误的,建议使用Laravel artisan命令并将该命令放在主机cron作业上,类似的情况除外,我使用调用为每个cron调用一个方法,例如:

$schedule->call('\App\Http\Controllers\comm\commCron::abc');
$schedule->call('\App\Http\Controllers\comm\commCron::xyz');
我也有同样的问题,后来意识到第一个cron在某个错误点调用了一个
exit


因此,请确保
exit
die()。只要
返回false即可(如果需要)。

在使用Laravel的内置调度模块时,我们运行了类似的介绍

在我们的例子中,第一个命令以静默方式失败,并阻止后续计划的命令运行


作为一个快速测试,尝试更改命令的顺序,使email:send位于底部,然后看看是否有效。一般来说,捕获可能引发的任何异常,它应该可以解决问题。

我认为您可能需要查看实际的服务器cron配置。Laravel scheduler要求服务器cron每分钟运行一次,以便所有计划在所需时间运行。您可以让cron每天早上8点而不是每分钟运行

这可能值得一看,我知道我第一次开始安排日程时遇到了同样的问题

使用调度程序时,只需将以下Cron条目添加到服务器。如果您不知道如何向您的服务器添加CRON条目,请考虑使用诸如LaaFielFog这样的服务,它可以为您管理CRON条目:

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

这个Cron每分钟都会调用Laravel命令调度程序。执行schedule:run命令时,Laravel将评估您计划的任务并运行到期的任务。

添加此问题已经4年了,但我希望我的回答仍然可以帮助任何人。在我的案例中(改编自您的案例),我只是在我的
Kernel.php
中添加了一些带有Laravel的
Carbon
包的条件案例

在我的例子中,我想运行3个调度器。两个调度程序将在每周一上午8点和下午5点运行一次,另一个调度程序将每天运行一次。这就是我创造条件的方式

public function schedule(Schedule $schedule)
{
   if(Carbon::now()->format('N') == '1')  //check if today is Monday
   {
      if(Carbon::now()->format('G') == '8')  //check if now is 8 AM
      {
         $schedule->command('first:command')->everyMinute();
      }
      if(Carbon::now()->format('G') == '17') //check if now is 5 PM
      {
         $schedule->command('second:command')->everyMinute();
      }
   }

   $schedule->command('another:command')->dailyAt('08:00')->withoutOverlapping();
}
然后,您可以在服务器中设置cron作业以每小时运行一次。
other:command
计划不会一天运行24次,因为我添加了
withoutOverlapping()
方法,它只会在上午8点运行。
如有必要,请参阅此关于调度和此关于日期-时间格式。

使用Laravel 5.1.31时会遇到相同的问题相关问题:使用Laravel 5.1.34可以很好地工作也请记住,此调度不是在服务器时间工作,而是在应用程序时间工作。因此,请仔细检查使用您的应用程序的时区,或者在artisan tinker中键入“date('H:i')”,确保该应用程序与您的机器具有相同的时间。@GiedriusKiršys我有两个
dailyAt
。第一个在跑,第二个没有。我想我会尝试更新。谢谢。这有什么关系?提醒不要使用
exit
dd
die()。我用这个提醒解决了我的日程问题。