首页 > php框架 > Laravel > 正文

laravel 队列是什么

青灯夜游
发布: 2022-02-14 15:25:42
原创
3311 人浏览过

在laravel中,队列是一种操作受限制的线性表,它只允许在表的前端(队头)进行删除操作,而在表的后端(队尾)进行插入操作;通过队列,开发者可以将耗时任务的处理往后推延,进而可以极大地提升web请求响应速度。

laravel 队列是什么

本教程操作环境:windows7系统、Laravel6版、Dell G3电脑。

laravel中队列的使用

1、什么是队列

队列是一种操作受限制的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。

通过队列,你可以将耗时任务 (如发送电子邮件) 的处理往后推延。延迟这些耗时的任务可以极大地提升 web 请求响应速度。

2、优点

  • 解耦:消息队列可以对系统进行解耦,提高响应速度,系统功能向内聚合,对外开放;

  • 异步:消息队列可以对系统异步功能进行剥离,减少功能耦合,提供开发效率;

  • 削峰:消息队列可以削峰限流,确保下游消费者稳定运行;

3、配置

队列配置文件存储在 config/queue.php 中。 在这个文件中,你可以找到框架中包含的每个队列驱动程序的连接配置,其中包括数据库,Beanstalkd,Amazon SQS,Redis,和一个同步驱动程序(sync-供本地使用)。
这里使用 Redis 作为驱动,需要安装好 Redis 以及 相关扩展。

4、任务

我们需要把一些东西放入队列中,我们可以称之为任务。Laravel 框架中创建任务给我们提供了以下命令:

php artisan make:job TestJob
登录后复制

TestJob.php

namespace App\Jobs;use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldBeUnique;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Foundation\Bus\Dispatchable;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Queue\SerializesModels;use Illuminate\Support\Facades\DB;use Symfony\Polyfill\Intl\Idn\Info;class TestJob 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()
    {//        \Log::info('hhh');
        DB::connection('test')
            ->table('master')
            ->insert([
                'name'=>'小白',
                'email'=>'123@qq.com'
            ]);
    }}
登录后复制

5、分发

一旦编写了任务类,就可以使用任务本身的 dispatch 方法来分派它。传递给 dispatch 方法的参数将被传递给任务的构造函数。

onQueue: 指定队列;
onConnection: 指定连接;
delay: 延迟队列;
dispatchNow: 同步调度;

#在路由中简单调用
Route::get('queue',function(){
        \App\Jobs\TestJob::dispatch();
//        \App\Jobs\TestJob::dispatch()->onQueue('qq');
    });
登录后复制

运行两次该路由可以看到生成一个名为qq的队列,后面我们对队列进行消费

1.webp.jpg

6、队列消费

Laravel 有一个队列处理器对新推入队列的任务进行处理。通过 Artisan 命令 queue:work 来启动队列处理器。需要注意的是,一旦 queue:work 命令启动,将一直保持运行,直到它被手动停止或你关闭你的终端:

php artisan queue:work
php artisan queue:work --once 添加参数,消费指定队列

#消费qq队列
php artisan queue:work --queue=qq
登录后复制

可以看到数据库中新增了两条数据,并且redis中数据被消费

2.webp.jpg

3.webp.jpg

我们再次执行路由

4.png

7、事件队列

队列通常是用来处理延迟任务,事件是业务逻辑处理。Laravel 中的 事件 触发器分发至队列中进行异步业务处理,那么这样之后可以快速做出响应而不用实时等待执行结果之后才能给使用者做出提示消息。
如果需要把事件中的业务存放到队列中去,我们并不需要重新进行队列的分发,直接在对应的监听器中实现 Illuminate\Contracts\Queue\ShouldQueue 接口即可。

创建事件和监听器

php artisan make:event TestEvent
php artisan make:listener TestListener
登录后复制

在app\providers\EventServiceProvider.php中注册

5.webp.jpg

TestListener.php

namespace App\Listeners;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\DB;

class TestListener implements ShouldQueue
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle()
    {
        DB::connection('test')
            ->table('master')
            ->insert([
                'name'=>'小黑',
                'email'=>'234@qq.com'
            ]);
    }
}
登录后复制

修改路由

Route::get('queue',function(){
        //\App\Jobs\TestJob::dispatch();
        //指定队列名称
        //\App\Jobs\TestJob::dispatch()->onQueue('qq');
        return event(new \App\Events\TestEvent());
    });
登录后复制

运行路由

6.webp.jpg

消费队列

php artisan queue:work
登录后复制

7.webp.jpg

【相关推荐:laravel视频教程

以上是laravel 队列是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!