美文网首页PHP知识
laravel 队列的使用

laravel 队列的使用

作者: _不能说的秘密i | 来源:发表于2018-08-30 13:02 被阅读9次

    laravel version: 5.4.*

    为什么有使用队列?

    使用队列可以将某些耗时任务(比如发送邮件)延迟执行从而大幅提升web请求速度

    配置

    • 队列的配置文件: /config/queue.php
    • laravel 支持多种队列驱动 sync database beanstalkd sqs redis
    • 可以在 .env 文件中配置队列驱动的类型 QUEUE_DRIVER=database 默认是 sync

    队列的基本使用

    1.迁移队列的数据表

    • 创建迁移文件(队列记录表)
    php artisan queue:table
    
    • 创建迁移文件(失败队列记录表)
    php artisan queue:failed-table
    
    php artisan migrate
    
    • 执行数据库迁移, 执行后会在数据库中创建 jobsfailed_jobs 两个数据表

    2.编写任务类

    php artisan make:job  SendEmail
    
    • 编写任务类
    <?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;
    
        protected $email;
    
    
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct($email)
        {
            $this->email = $email;
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            Mail::raw('测试队列', function($message) {
                $message->to($this->email);
            });
        }
    
    }
    
    

    3.推送任务到队列

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use App\Jobs\SendEmail;
    use Mail;
    
    class TestController extends Controller{
        public function queue(){
            // dispatch 的参数是你刚刚创建的任务类 /jobs 目录下的类
            dispatch(new SendEmail('3233824562@qq.com'));
        }
    }
    
    • 因为 Controller 类use了 DispatchesJobs 这个 trait 所以能够直接使用 dispatch 方法
    • 如果需要在模型中用 dispatch 方法,请手动 use 这个 trait
    • 在浏览器中访问这个控制器方法, 会发现在 jobs 这个数据表中多了一条记录

    4.运行队列监听器

    php artisan queue:listen
    
    • 如果执行成功, jobs 中的数据表就没有数据了
    • 如果执行失败,可以在日志中查看原因, 默认是 storage/logs/laravel.log

    4.处理失败的任务

    在任务失败时, 你可以选择 清除失败的任务或者 重新执行失败的任务

    • 查看所有失败的任务, 会将所有失败的任务查询出来输出到命令行
    php artisan queue:failed
    
    重新执行失败任务
    • 重新执行指定id失败的任务
    php artisan queue:retry 1
    

    此处的 1 失败任务表中的任务的 id, 表示重新执行指定id失败任务

    • 重新执行所有的失败任务
    php artisan queue:retry all
    
    清除失败任务
    • 清除指定id失败的任务
    php artisan queue:forget 2
    

    此处的 2 失败任务表中的任务的 id, 表示清除指定id失败任务

    • 清除所有失败的任务
    php artisan queue:flush
    

    相关文章

      网友评论

        本文标题:laravel 队列的使用

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