在添加和 运行 另一个任务之前检查调度程序任务的状态
Check status of an scheduler task before adding and running another task
我对 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();
如何修改?
谢谢。
在 laravel 时间表文档中提到了以下两个功能:
- 真值测试约束docs
$schedule->command('emails:send')->daily()->skip(function () {
return true;
});
- 任务挂钩docs
$schedule->command('emails:send')
->daily()
->before(function () {
// Task is about to start...
})
->after(function () {
// Task is complete...
});
您可以考虑在 before()
闭包中将 $achriveCommandIsRunning
之类的变量设置为 true。在 skip()
闭包中,您可以 return $archiveCommandIsRunning;
,在 after()
闭包中,您可以再次将变量设置回 false。
谢谢,
我按照你说的修改了我的代码,现在可以用了。
这是最终代码:
$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();
我对 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();
如何修改?
谢谢。
在 laravel 时间表文档中提到了以下两个功能:
- 真值测试约束docs
$schedule->command('emails:send')->daily()->skip(function () {
return true;
});
- 任务挂钩docs
$schedule->command('emails:send')
->daily()
->before(function () {
// Task is about to start...
})
->after(function () {
// Task is complete...
});
您可以考虑在 before()
闭包中将 $achriveCommandIsRunning
之类的变量设置为 true。在 skip()
闭包中,您可以 return $archiveCommandIsRunning;
,在 after()
闭包中,您可以再次将变量设置回 false。
谢谢,
我按照你说的修改了我的代码,现在可以用了。 这是最终代码:
$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();