gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:31:03 24 4
gpt4 key购买 nike

这个问题类似于 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() 时方法 :

    The emailOutputTo, sendOutputTo and appendOutputTo methods are exclusive to the command method and are not supported for call.



    我尝试对上述 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\Component\Debug\Exception\FatalThrowableError]
    Type error: Too few arguments to function Illuminate\Foundation\Console\Kernel::command(), 1 passed in /app/Console/Kernel.php on line 33 and exactly 2 expected



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

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

    选项 1 - 尝试将输出包含到普通电子邮件中
    结果 = commandB未执行,仅通过电子邮件发送 commandA 输出:
    protected function schedule(Schedule $schedule) {
    $schedule ->command('commandA:myoption')
    ->then(function(Schedule $schedule) {
    return $schedule->command('commandB:myoption');
    })
    ->emailOutputTo('myemail@gmail.com');
    }

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

    结果 = commandB未执行,仅通过电子邮件发送 commandA 输出:
    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 - 注入(inject) $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 如此兴奋!!?

    最佳答案

    在文档中它说:

    By default, multiple tasks scheduled at the same time will executesequentially based on the order they are defined in your schedulemethod.


    在我的用例中,我只有三个任务每天只需要运行一次(阅读:早上),我刚刚创建了三个调度程序来同时运行。
    在您的情况下,这可能不起作用,因为您的一项任务可能会运行超过 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 闭包,但它只运行函数内部的命令之一。

    关于php - Laravel Scheduler - 如何输出链式/系列命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42287129/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com