0

我对laravel 框架中的任务调度有疑问。我已经在控制台命令列表中定义了currency:update命令currency:archive。现在,我想在 schedule 方法中运行这两个命令,但条件如下:

如果这是运行命令的时间,在前一个命令(即)结束之前currency:archive不要运行另一个命令;否则运行命令。currency:updatecurrency:archivecurrency:update

这是我当前在 schedule 方法中的代码:

$schedule->command('currency:archive')
         ->dailyAt('00:00')
         ->withoutOverlapping();

$schedule->command('currency:update')
         ->everyMinute()
         ->withoutOverlapping();

我应该如何修改它?

谢谢。

4

2 回答 2

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();
于 2019-08-23T06:35:05.133 回答
1

在 laravel schedule docs 中提到了以下两个特性:

  1. 真值测试约束文档
$schedule->command('emails:send')->daily()->skip(function () {
    return true;
});
  1. 任务挂钩文档
$schedule->command('emails:send')
         ->daily()
         ->before(function () {
             // Task is about to start...
         })
         ->after(function () {
             // Task is complete...
         });

您可以考虑在闭包中设置一个类似于$achriveCommandIsRunningtrue的变量。before()skip()闭包中你可以return $archiveCommandIsRunning;并且在after()闭包中你可以再次将变量设置回false。

于 2019-08-22T22:26:58.423 回答