我想在不同的时间在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
- 有效。其他命令在指定时间不起作用。但是,当我手动运行它们时它们工作正常。
我错过了什么?
答案 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
。
因此,请确保exit
或die()
中没有任何一个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作业上