Laravel Scheduler - 如何输出链式/系列命令?

时间:2017-02-17 00:11:35

标签: php laravel laravel-5 cron artisan

这个问题类似于this one,但是:

  • 我需要用emailOutputTo方法发送链式(第2,第3或第4)命令的输出

单一命令调度程序代码
这工作正常 - 命令和电子邮件输出:

protected function schedule(Schedule $schedule)
{
    $schedule   ->command('commandA:myoption')
                ->emailOutputTo('myemail@gmail.com');
}

链式命令/呼叫 - 使用以前的SO答案
前面提到的accepted answer正确运行commandB,但因为它使用了->call(),所以它不包含电子邮件中commandB的输出:

protected function schedule(Schedule $schedule) {
    $schedule   ->command('commandA:myoption')
                ->then(function() {
                    return $this->call('commandB:myoption');
                })
                ->emailOutputTo('myemail@gmail.com');
}

... as noted here只有在使用->call()方法时才能通过调度程序->command()方法发送电子邮件:

  

emailOutputTo,sendOutputTo和appendOutputTo方法是命令方法独有的,不支持调用。

我尝试修改上述accepted answer以使用->command()
而不是->call()

protected function schedule(Schedule $schedule) {
    $schedule   ->command('commandA:myoption')
                ->then(function() {
                    $this->command('commandB:myoption');
                            ->emailOutputTo('myemail@gmail.com');
                })
                ->emailOutputTo('myemail@gmail.com');
}

...出现以下错误:

  

[Symfony的\元器件\调试\异常\ FatalThrowableError]
  类型错误:函数参数太少   Illuminate \ Foundation \ Console \ Kernel :: command(),1在第33行传入/app/Console/Kernel.php,正好是2个

链接/系列命令的其他尝试

尝试了各种方法来链接命令using a then function - 似乎没有工作(运行命令或输出):

选项1 - 尝试将输出包含在通用电子邮件中 结果= commandB未执行,仅通过电子邮件发送命令A输出:

protected function schedule(Schedule $schedule) {
    $schedule   ->command('commandA:myoption')
                ->then(function(Schedule $schedule) {
                    return $schedule->command('commandB:myoption');
                })
                ->emailOutputTo('myemail@gmail.com');
}

选项2 - 尝试将输出包含在单独的电子邮件中 (通过在主要和第二个命令中发送单独的电子邮件输出)

结果= commandB未执行,仅通过电子邮件发送命令A输出:

protected function schedule(Schedule $schedule) {
    $schedule   ->command('commandA:myoption')
                ->then(function(Schedule $schedule) {
                    $schedule->command('commandB:myoption')
                            ->emailOutputTo('myemail@gmail.com');
                })
                ->emailOutputTo('myemail@gmail.com');
}

选项3 - 另一种注入$ schedule的变体 - 没有成功(相同的结果)

protected function schedule(Schedule $schedule) {
    $schedule   ->command('commandA:myoption')
                ->then(function() use($schedule) {
                    return $schedule->command('commandB:myoption')
                                ->emailOutputTo('myemail@gmail.com');
                })
                ->emailOutputTo('myemail@gmail.com');
}

问题
如何在调度程序中链接命令并将所有命令的输出发送到

  • 一个常见的电子邮件?
  • 单独的电子邮件(如果无法通用)?

...顺便说一句,为什么每个人都对Laravel如此兴奋,因为文档如此可怜不完整!!?

1 个答案:

答案 0 :(得分:0)

在文档中它说:

<块引用>

默认情况下,同时调度的多个任务会执行 根据它们在您的日程表中定义的顺序顺序 方法。

在我的用例中,我只有三个每天只需要运行一次的任务(阅读:早上),我刚刚创建了三个调度程序来同时运行。 在您的情况下,这可能不起作用,因为您的一项任务可能运行超过 5 分钟。

我的最终看起来像这样:

// $schedule->command('inspire')->hourly();
        $schedule->command('command:first')
            ->dailyAt('12:34')
        ->timezone('Europe/Oslo');
        $schedule->command('command:second')
            ->dailyAt('12:34')
            ->timezone('Europe/Oslo');
        $schedule->command('command:third')
            ->dailyAt('12:34')
            ->timezone('Europe/Oslo');

只有当您有多个任务必须按特定顺序运行,并且每天(或每周)只运行一次时,此解决方案才有效。

我尝试使用 then 闭包,但它只运行了函数内的一个命令。