zoukankan      html  css  js  c++  java
  • Laravel 5.2 教程

    一、简介

    Laravel 队列组件提供一个统一的 API 集成了许多不同的队列服务,队列允许你延后执行一个耗时的任务,例如延后至指定的时间才发送邮件,进而大幅的加快了应用程序处理请求的速度。

    由于本例子用到邮件功能,不了解的童鞋请移步(Laravel 5.2 教程 - 邮件)

    二、配置

    1. 配置文件

    队列配置文件存放在config/queue.php。在该文件中你将会找到框架自带的每一个队列驱动的连接配置,包括数据库、Beanstalkd、 IronMQ、 Amazon SQS、 Redis以及同步(本地使用)驱动。其中还包含了一个null队列驱动以拒绝队列任务。

    .env 配置默认是同步sync 本文章演示使用database方式

    2. 迁移队列需要的数据表

    php artisan queue:table
    php artisan migrate

    三、编写任务类

    1. 生成任务类

    默认情况下,应用的所有队列任务都存放在app/Jobs目录。

    php artisan make:job SendReminderEmail

    该命令将会在app/Jobs目录下生成一个新的类,并且该类实现了IlluminateContractsQueueShouldQueue接口,告诉Laravel该任务应该被推送到队列而不是同步运行。

    2. 编写任务类

    下面是一个通过队列发送邮件的简单例子:

    <?php
    
        namespace AppJobs;
    
        use AppJobsJob;
        use IlluminateQueueSerializesModels;
        use IlluminateQueueInteractsWithQueue;
        use IlluminateContractsQueueShouldQueue;
        use Mail;
    
        class SendReminderEmail extends Job implements ShouldQueue
        {
            use InteractsWithQueue, SerializesModels;
    
            protected $email;
    
            /**
             * 创建一个新的任务实例
             *
             * @param $email
             */
            public function __construct($email)
            {
                $this->email = $email;
            }
    
            /**
             * 执行任务
             *
             * @return void
             */
            public function handle()
            {
                // 发送邮件
                Mail::raw('Queue test', function($message) {
    
                    $message->subject('测试邮件,勿回');
                    $message->to($this->email);
                });
            }
        }

    四、推送任务到队列

    1. 控制器中

    因为Laravel app/Http/Controllers/Controller.php 使用了DispatchesJobs trait。该trait提供了一些允许你方便推送任务到队列的方法,例如dispatch方法:

    $this->dispatch(new SendReminderEmail('849291170@qq.com'));    

    2. DispatchesJobs trait

    如果你想在路由或控制器之外的某些地方分发任务,可以使用DispatchesJobs trait 在任何地方将任务添加到队列。下面是在模型中使用的例子:

    <?php
    
        namespace App;
    
        use AppJobsSendReminderEmail;
        use IlluminateDatabaseEloquentModel;
        use IlluminateFoundationBusDispatchesJobs;
    
        class Student extends Model
        {
            use DispatchesJobs;
    
            public static function queue()
            {
    
                dispatch(new SendReminderEmail('849291170@qq.com'));
            }
        }

    3. 延迟执行

    下面是延迟60秒执行的例子:

    $job = (new SendReminderEmail('849291170@qq.com'))->delay(60);
    $this->dispatch($job);

    五、运行队列监听器

    Artisan控制台运行如下命令

    php artisan queue:listen

    使用–tries开关来指定任务最大可尝试执行次数

    php artisan queue:listen --tries=3

    六、处理失败的任务

    任务执行次数达到最大限制后,会被插入到failed_jobs表,失败任务的名字可以通过配置文件config/queue.php来配置。

    1. 迁移记录失败队列需要的数据表

    php artisan queue:failed-table
    php artisan migrate

    2. 重试失败任务

    要查看已插入到failed_jobs数据表中的所有失败任务,该命令将会列出任务ID,连接,对列和失败时间。

    php artisan queue:failed

    任务ID可用于重试失败任务,例如,要重试一个ID为5的失败任务,要用到下面的命令:

    php artisan queue:retry 5

    要重试所有失败任务,使用如下命令即可:

    php artisan queue:retry all

    如果你要删除一个失败任务,可以使用queue:forget命令:

    php artisan queue:forget 5

    要删除所有失败任务,可以使用queue:flush命令:

    php artisan queue:flush

    交友互动:

    本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。
    马燕龙个人博客:http://www.mayanlong.com
    马燕龙个人微博:http://weibo.com/imayanlong
    马燕龙Github主页:https://github.com/yanlongma

  • 相关阅读:
    「ROI 2019 Day1」运输 20/19
    「ROI 2018 Day 2」无进位加法
    「ROI 2018 Day 1」量子隐形传态
    「ROI 2018 Day 2」快速排序
    「ROI 2018 Day 1」Innophone (分块+斜率优化)
    「ROI 2017 Day 1」虎 (计算几何)
    [BJ United Round #3] 押韵 [学习笔记]
    「CEOI2020」象棋世界
    CF1375G
    CF1392(div1+div2)
  • 原文地址:https://www.cnblogs.com/imayanlong/p/6033020.html
Copyright © 2011-2022 走看看