美文网首页Laravel
Laravel 队列queue(database篇)

Laravel 队列queue(database篇)

作者: 快点跑哇 | 来源:发表于2018-07-19 14:21 被阅读288次

队列

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

配置文件

  1. Config/queue.php(此文件无需更改)
    支持模式 Supported: "sync", "database","beanstalkd", "sqs", "redis", 此次已database为例
    //默认选择的是同步驱动
    'default' =>env('QUEUE_DRIVER', 'sync'),
  2. env(更改为database驱动)
    QUEUE_DRIVER=database

实现步骤

  1. 队列存储需要的数据表
    可以执行以下操作命令,生成队列所需要的数据表jobs
php artisan queue:table
php artisan migrate
  1. 编写任务类
php artisan make:job SendEmail

这时会在app/jobs目录下生成SendEmail.php

<?php

namespace App\Jobs;

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

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

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        Mail::raw('邮件内容', function($message) {
            //收件人
            $message->to($this->email);
        });
    }
}

将需要在在队列中完成的操作写入 handle()方法中。

  1. 推送任务到队列
  • 可以在Controller中推送任务
public function queue()
{
    //dispatch 已经基础controller里已经引用
    dispatch(new SendEmail('…………@qq.com'));
}
  • 还有比较常用的是Model::saved()中推送任务
public function saved(User $user)
 {
      dispatch(new SendEmail('…………@qq.com'));
}

当我们执行完消息推送之后,数据库jobs表中会多一条数据

  1. 运行队列监听器(实现任务按队列运行)
    (1). listen
    php artisan queue:listen
    // 监听指定的队列
    // --queue 被监听的队列
    // --delay 给执行失败的任务设置延时时间 (默认为零: 0)
    // --memory 内存限制大小,单位为 MB (默认为: 128)
    // --timeout 指定任务运行超时秒数 (默认为: 60)
    // --sleep 等待检查队列任务的秒数 (默认为: 3)
    // --tries 任务记录失败重试次数 (默认为: 0)
    php artisan queue:listen [--queue[="..."]] [--delay[="..."]] [--memory[="..."]] [--timeout[="..."]] [--sleep[="..."]] [--tries[="..."]] [connection]
    (1). work
    php artisan queue:work --daemon
    // 处理下一个队列任务
    // --queue 被监听的队列
    // --daemon 在后台模式运行
    // --delay 给执行失败的任务设置延时时间 (默认为零: 0)
    // --force 强制在「维护模式下」运行
    // --memory 内存限制大小,单位为 MB (默认为: 128)
    // --sleep 当没有任务处于有效状态时, 设置其进入休眠的秒数 (默认为: 3)
    // --tries 任务记录失败重试次数 (默认为: 0)

注:一般测试开发用listen,线上用work,有兴趣的同学可以自己研究一下 区别

  1. 队列中的任务处理失败
  • 生成存储失败队列的数据表
php artisan queue:failed-table
php artisan migrate
  • 操作执行错误的记录
    查看所有错误php artisan queue:failed
    执行错误ID为1的记录 php artisan queue:retry 1
    执行所有错误php artisan queue:retry all
    删除错误ID为4的记录 php artisan queue:forget failed 4
    删除所有错误 php artisan queue:forget flush

相关文章

  • Laravel 队列queue(database篇)

    队列 Laravel队列服务为各种不同的后台队列提供统一的API允许推迟耗时任务(例如发送邮件)的执行,从而大幅提...

  • database 保存队列

    database 作为队列 参看以下 php artisan queue:table 生成的文件源码 处理失败队列任务

  • Laravel 异步延迟推送消息

    实现方案:采用job队列 修改.env文件 QUEUE_CONNECTION 为redis 或者database ...

  • Laravel database队列使用

    https://laravelacademy.org/post/19553.html 1.修改ENV文件 设置队列...

  • laravel之队列详解

    说明 laravel5.2,redis3 配置 就是把队列文件改成redis驱动config/queue.php....

  • laravel 队列

    laravel队列文档 1.概念理解 连接(connections ):config/queue.php中有一个c...

  • Laravel队列

    步骤: 驱动选择在.env环境中修改QUEUE_DRIVER=database来实现 定义任务 分发任务 启动队列...

  • 循环队列的实现方法1

    设:队列长度是QUEUE_LENGTH队列数组是queue[QUEUE_LENGTH]队列头索引是head队列尾索...

  • Laravel 队列的简单例子

    这里使用数据库队列来驱动 1. 修改 .env 中的 QUEUE_DRIVER 值 2. 要使用 database...

  • Java—Queue队列详解

    Queue Queue队列介绍   Queue是用于模拟队列的,啥叫队列?队列就是排队的意思,比如排队结账,先进入...

网友评论

    本文标题:Laravel 队列queue(database篇)

    本文链接:https://www.haomeiwen.com/subject/uoizpftx.html