Laravel 5.2 教程 - 队列

作者: 天秤vs永恒 | 来源:发表于2016-08-17 17:02 被阅读839次

一、简介

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目录下生成一个新的类,并且该类实现了Illuminate\Contracts\Queue\ShouldQueue接口,告诉Laravel该任务应该被推送到队列而不是同步运行。

2. 编写任务类

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

<?php

    namespace App\Jobs;

    use App\Jobs\Job;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    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 App\Jobs\SendReminderEmail;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Foundation\Bus\DispatchesJobs;

    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

相关文章

  • Laravel 5.2 教程 - 队列

    一、简介 Laravel 队列组件提供一个统一的 API 集成了许多不同的队列服务,队列允许你延后执行一个耗时的任...

  • 学习laravel遇到的一些错误

    博主运行环境:windows 7、homestead、laravel5.2参考教程:安装及快速上手教程:环境配置及...

  • laravel之队列详解

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

  • Laravel5.2 中的HTML和Form

    laravel5.2 Forms & HTML 问题: 初学,照教程composer一个叫illuminate/h...

  • Laravel 5.2 教程 - 邮件

    一、简介 Laravel 的邮件功能基于热门的 SwiftMailer 函数库之上,提供了一个简洁的 API。La...

  • Laravel 5.2 教程 - 迁移

    一、简介 迁移(Migrations)是一种数据库的版本控制。可以让团队在修改数据库结构的同时,保持彼此的进度一致...

  • Laravel中使用队列

    Laravel中使用队列 官方教程 ## 安装依赖扩展包 composer require"predis/pred...

  • Laravel-博客实战+踩坑

    最近在学习Laravel,参考的课程是后盾网地Laravel5.2博客项目实战,地址是Laravel 5.2开发实...

  • 资料

    《Pro git》 学习git 搭建laravel开发环境homestead redis教程 TP消息队列 thi...

  • composer安装laravel框架

    1、安装命令 composer create-project laravel/laravel="5.2...

网友评论

    本文标题:Laravel 5.2 教程 - 队列

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