美文网首页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篇)

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