Laravel的队列系统默认是串行处理作业的,这意味着每个作业都要等待前一个作业处理完毕后才能开始处理。但是,有时候我们需要同时处理多个作业,这就需要并发处理。
Laravel通过将队列连接设置为"redis","database"或"beanstalkd"来实现并发处理。这些连接可以处理多个并发作业。
Laravel队列系统还支持作业优先级,这意味着我们可以为不同类型的作业分配不同的优先级。优先级高的作业将在优先级低的作业之前处理。优先级默认为0,值越高表示优先级越高。
(资料图)
我们可以使用--queue
选项在调度作业时指定作业队列。例如,我们可以使用以下代码将作业推送到"high"队列:
ProcessPodcast::dispatch($podcast)->onQueue("high");
然后,我们可以使用以下命令启动一个专用的队列进程来处理高优先级队列:
php artisan queue:work --queue=high
如果一个作业执行时间过长,可能会导致队列堵塞,这就需要设置作业的超时时间。Laravel默认的作业超时时间为60秒。
我们可以在定义作业类时使用--timeout
选项来设置超时时间。例如,以下代码设置超时时间为120秒:
php artisan make:job ProcessPodcast --timeout=120
如果作业在超时时间内没有处理完成,Laravel将尝试终止该作业并将其标记为失败。
Laravel队列系统默认会自动重试作业,如果一个作业失败了,它将被重新推送到队列中,直到达到最大尝试次数。最大尝试次数默认为3,可以在config/queue.php
中进行配置。
如果要禁用作业重试,我们可以在定义作业类时使用--tries
选项将最大尝试次数设置为0:
php artisan make:job ProcessPodcast --tries=0
如果一个作业达到最大尝试次数仍然失败,它将被标记为失败。Laravel默认会将失败的作业写入日志文件。我们还可以在config/queue.php
中配置将失败的作业发送到其他通知渠道,例如电子邮件或Slack。
当然,我们还可以通过手动调用fail
方法来标记一个作业为失败:
/** * Execute the job. * * @return void */public function handle(){ if ($this->somethingWentWrong()) { $this->fail(new Exception("Something went wrong.")); } // Process the podcast...}