Php 在Laravel中调度多个cron
我正在尝试在不同的时间在Laravel运行多个作业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
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()。我用这个提醒解决了我的日程问题。