Php 当作业失败时,如何触发laravel jobs failed()方法?
目前我正在调用taskPhp 当作业失败时,如何触发laravel jobs failed()方法?,php,laravel-5.2,Php,Laravel 5.2,目前我正在调用taskReport.php并使用generateReport()方法生成报告。我已经检查了作业是否已使用CLI命令php artsan queue:listen执行。如果调用Artisan::call()时出现任何错误,终端中将显示错误消息。因此,我想在failed()中捕获异常,并将错误记录到日志中。 我在handle()方法中尝试了try catch,但它没有捕获异常 protected $options; public function __construct($optio
Report.php
并使用generateReport()
方法生成报告。我已经检查了作业是否已使用CLI命令php artsan queue:listen
执行。如果调用Artisan::call()
时出现任何错误,终端中将显示错误消息。因此,我想在failed()
中捕获异常,并将错误记录到日志中。
我在handle()
方法中尝试了try catch
,但它没有捕获异常
protected $options;
public function __construct($options)
{
$this->options = array_merge(
[
'task' => 'Report',
'do' => 'generateReport',
'limit' => '10000'
],
$options
);
}
public function handle()
{
Artisan::call('execute', [
'--task' => $this->options['task'],
'--do' => $this->options['do'],
'--parameters' => $this->options,
]);
}
public function failed()
{
//
}
如何触发
failed()
并将错误记录到日志中?Artisan::call
实际上只是调用execute
控制台类,因此如果在其中抛出异常
,它应该会自动结束在failed
方法中
但是,在5.2
中,异常
对象不会传递给失败的方法(这是在5.3
中添加的)
Laravel 5.2
因此,如果需要将异常
对象传递给失败的
方法,则需要在5.2
中执行类似操作:
public function handle()
{
try {
Artisan::call('execute', [
'--task' => $this->options['task'],
'--do' => $this->options['do'],
'--parameters' => $this->options,
]);
} catch (\Exception $e) {
$this->failed($e)
}
}
public function failed(\Exception $e = null)
{
//handle error
}
Laravel 5.3+
在5.3
中,异常
自动传递给失败
,因此您的代码如下所示:
public function handle()
{
Artisan::call('execute', [
'--task' => $this->options['task'],
'--do' => $this->options['do'],
'--parameters' => $this->options,
]);
}
public function failed(\Exception $e = null)
{
//handle error
}
如果我想在作业队列引发异常时继续该怎么办?因为当它抛出异常时,它会停止处理所有队列工作。我需要手动运行Artisan queue:work命令。这个答案完全错误,
failed()
方法是在作业失败后执行某些操作的方法,例如,编写日志,或向管理员发送包含失败作业信息的邮件,如果handle()中出现任何异常,则调用此方法
无法直接调用。@OlegShakhov我不确定您是否完全阅读了答案。没有什么可以阻止您直接调用failed
方法,因为它是一个公共方法。在Laravel 5.2中,在异常未传递到失败的方法之前。在Laravel 5.3和之后,异常总是传递给failed
方法,我的回答清楚地解释了这一点。