在Laravel安排多个crons

时间:2015-10-02 17:36:47

标签: php laravel cron

我想在不同的时间在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 - 有效。其他命令在指定时间不起作用。但是,当我手动运行它们时它们工作正常。

我错过了什么?

8 个答案:

答案 0 :(得分:2)

我认为您可能需要查看实际的服务器cron配置。 Laravel调度程序要求服务器cron每分钟运行一次,以便所有调度在所需时间运行。您可能只是每天早上8.00而不是每分钟运行一次cron。

也许值得一看,我知道我刚开始进行排程时遇到同样的问题。

使用调度程序时,只需要将以下Cron条目添加到服务器。如果您不知道如何向服务器添加Cron条目,请考虑使用Laravel Forge之类的服务来为您管理Cron条目:

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

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

答案 1 :(得分:0)

如果第二个命令不起作用:

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

你只能在一些文件中插入一行打印当前日期的代码,例如。 "的test.txt"如果创建了文件,则检查所需的时间。如果创建了文件,您可以得出结论,如果计划的脚本中的代码出错了。

答案 2 :(得分:0)

使用队列进行作业处理

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

运行多个队列工作程序

答案 3 :(得分:0)

类似的情况,除了我可以使用call为每个cron调用一个方法,例如:

$schedule->call('\App\Http\Controllers\comm\commCron::abc');
$schedule->call('\App\Http\Controllers\comm\commCron::xyz');

我遇到了同样的问题,后来发现第一个cron在某个错误点调用exit

因此,请确保exitdie()中没有任何一个crons撤退。只需return false代替(如果需要)。

答案 4 :(得分:0)

我们在使用Laravel的内置调度模块时遇到了类似的问题。

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

作为快速测试,请尝试更改命令的顺序,以便将电子邮件发送到底部并查看是否有效。通常,捕获可能抛出的任何异常,它应该解决问题。

答案 5 :(得分:0)

这个问题添加到现在已经4年了,但是我希望我的回答仍然可以对任何人有所帮助。就我而言(根据您的情况改编),我只是在Carbon中使用Laravel的Kernel.php包添加了一些条件案例。

就我而言,我想运行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作业以每小时运行一次。 another:command日程安排不会一天24次运行,因为我已经添加了withoutOverlapping()方法,并且只能在上午8点运行。 如有必要,请参阅此laravel docs有关调度的信息,有关此PHP docs有关日期时间格式的信息。

答案 6 :(得分:-1)

您可以尝试以下代码:

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();
}

上面的代码只是执行而没有重叠。您可以更多地了解prevent overlapping

如果你还面临同样的情况,请告诉我。

答案 7 :(得分:-1)

如果您需要使用Laravel Schedule使用此代码

    $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 Command并将该cammand放在主机cron作业上