我对laravel框架中的任务计划有疑问。我已经在控制台命令列表中定义了命令currency:update
和currency:archive
。现在,我要在schedule方法中运行这两个命令,但要满足以下条件:
如果这是运行currency:archive
命令的时间,请在上一个命令(即currency:update
)结束之前不要运行其他命令currency:archive
;否则,请运行currency:update
命令。
这是我当前的计划方法代码:
$schedule->command('currency:archive')
->dailyAt('00:00')
->withoutOverlapping();
$schedule->command('currency:update')
->everyMinute()
->withoutOverlapping();
我应该如何修改它?
谢谢。
答案 0 :(得分:1)
在laravel时间表文档中,提到了以下两个功能:
$schedule->command('emails:send')->daily()->skip(function () {
return true;
});
$schedule->command('emails:send')
->daily()
->before(function () {
// Task is about to start...
})
->after(function () {
// Task is complete...
});
您可以考虑在$achriveCommandIsRunning
闭包中将类似before()
的变量设置为true。在skip()
闭包中,您可以return $archiveCommandIsRunning;
;在after()
闭包中,您可以再次将变量设置回false。
答案 1 :(得分:1)
谢谢
我按照您所说的修改了代码,现在可以使用了。 这是最终代码:
$isArchiveCommandRunning = false;
$schedule->command('currency:archive')
->dailyAt('00:00')
->before(function () use (&$isArchiveCommandRunning) {
$isArchiveCommandRunning = true;
})
->after(function () use (&$isArchiveCommandRunning) {
$isArchiveCommandRunning = false;
})
->withoutOverlapping();
$schedule->command('currency:update')
->everyMinute()
->skip(function () use (&$isArchiveCommandRunning) {
return $isArchiveCommandRunning;
})
->withoutOverlapping();