Laravel 队列应用

Posted 小白兔晒黑了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 队列应用相关的知识,希望对你有一定的参考价值。

Laravel队列服务为各种不同的后台队列提供了统一的api。例如:允许推迟耗时任务(例如发送邮件)的执行,从而大幅提高web请求速度、

步骤:

1 迁移队列需要的数据表

2 编写任务类

3 推送任务到队列

4 运行队列监听器

5 处理失败的任务

使用:

1 配置

\\config\\queue.php

支持的驱动类型:
 "sync", 同步驱动
 "database",数据库驱动
 "beanstalkd",
 "sqs",
 "redis",
 "null"

失败配置:

\'failed\' => [
        \'driver\' => env(\'QUEUE_FAILED_DRIVER\', \'database\'),
        \'database\' => env(\'DB_CONNECTION\', \'mysql\'),
        \'table\' => \'failed_jobs\',
    ],
QUEUE_CONNECTION=database

2 创建迁移

php artisan queue:table

生成了一个迁移

3 执行迁移

php artisan migrate

4 创建任务

php artisan make:job SendEmail

5 任务代码

5.1 job
app\\Jobs\\SendEmail.php
<?php

namespace App\\Jobs;

use Illuminate\\Bus\\Queueable;
use Illuminate\\Contracts\\Queue\\ShouldQueue;
use Illuminate\\Foundation\\Bus\\Dispatchable;
use Illuminate\\Queue\\InteractsWithQueue;
use Illuminate\\Queue\\SerializesModels;
use Mail;

class SendEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $email;
    protected $subject;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($email,$subject)
    {
        //
        $this->email = $email;
        $this->subject = $subject;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //
        Mail::raw(\'队列测试\',function ($message){
            $message
                ->to($this->email)
                ->subject($this->subject);
        });
    }
}
View Code

 

5.2 控制器调用
\\app\\Http\\Controllers\\StudentController.php
use Log;
 public function queque()
    {
        $this->dispatch(new SendEmail(\'777777777@qq.com\',\'队列测试\'));
    }

 

调用以后会在数据库里发现一行:

 6 执行

php artisan queue:listen

 

执行成功

只要一直保持Listen状态

再访问一下queque页面 又会执行一条。

ps:执行完毕后,job表会被清空

处理失败任务

查看失败任务:
php artisan queue:failed

 重新执行第1个任务
php artisan queue:retry 1

 重新执行所有任务
php artisan queue:retry all

 

如果执行成功,会在failed表里删除

不想执行失败的队列了

根据id号删除

php artisan queue:forget 2

删除全部

php artisan queue:flush

 

以上是关于Laravel 队列应用的主要内容,如果未能解决你的问题,请参考以下文章

需要一种有效的方法来避免使用 Laravel 5 重复代码片段

# Java 常用代码片段

# Java 常用代码片段

Laravel 5.8 有条件地插入 sql 片段

在单个服务器上为多个 Laravel 应用程序使用 Redis 队列

Laravel:如何在控制器的几种方法中重用代码片段