Laravel Task Scheduler总是失败

问题描述

添加onFailure回调时,带有调用方法的Task Scheduler总是失败

基本测试:

// Console\Kernel.PHP
$schedule->call(function () {
    var_dump('test');
})
->onFailure(function () {
    var_dump('Failed');
})
->everyMinute();

image

我在某处错了或缺少了什么?

预先感谢

解决方法

更新:我提交了一个PR来解决Laravel框架中的问题,并且它刚刚被合并。看来这可以在Laravel 8中使用(我认为应该在下周发布)。

https://github.com/laravel/framework/pull/33914


成功/失败挂钩似乎不适用于闭包。

通过查看源代码,Laravel似乎依赖出口代码来确定计划任务是否成功:

https://github.com/laravel/framework/blob/7.x/src/Illuminate/Console/Scheduling/Event.php#L787

您可以在此处看到它正在寻找0以外的退出代码。

问题是,仅在通过外部过程调用计划的命令时设置退出代码:

https://github.com/laravel/framework/blob/7.x/src/Illuminate/Console/Scheduling/Event.php#L222

对于关闭(回调)任务,不会更新退出代码:

https://github.com/laravel/framework/blob/7.x/src/Illuminate/Console/Scheduling/CallbackEvent.php#L75-L85

这意味着退出代码仍为null(不为0),并且评估为失败。

这可能是Laravel团队会考虑为将来的版本进行改进的内容。同时,如果您编写传统的artisan command并通过调度程序运行它,您应该会发现成功/失败钩子按预期工作。