laravel队列服务

  • 简介

Laravel 队列为不同的后台队列服务提供了统一的 API,例如 Beanstalk,Amazon SQS,Redis,甚至其他基于关系型数据库的队列。队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求和响应的时间。
队列配置文件存放在 config/queue.php。每一种队列驱动的配置都可以在该文件中找到,包括数据库、Beanstalkd、Amazon SQS、Redis以及同步(本地使用)驱动。此处我门使用最常用的redis和rabbitMQ驱动。

一, 相关环境

由于是本地测试,所以我使用phpstudy配置好的nginx+php7.3+redis,rabbitMQ是基于erlang开发,所以需要安装erlang环境。使用composer安装了laravel5.7版本。erlang版本为Erlang v21.2 ,由于没有科学上网法,光网下载实在是慢,我在此处下载了资源https://www.jb51.net/softs/653513.html
此处需要注意的是安装rabbitMQ的版本需要对应erlang的版本,https://www.rabbitmq.com/which-erlang.html
laravel队列服务_第1张图片

  • 安装
    1.erlang安装
    下载后点击otp_win64_21.2.exe安装到自己定义的目录下,并添加为系统环境变量
    laravel队列服务_第2张图片
    并点击 path 添加系统环境变量
    laravel队列服务_第3张图片
    然后打开cmd,执行 erl -version
    在这里插入图片描述
    表示安装成。
    2.安装rabbitMQ
    https://mirrors.huaweicloud.com/rabbitmq-server/v3.7.15/
    下载安装了3.7.15版本
    安装成功后 打开windows服务,查看服务是否启动
    laravel队列服务_第4张图片
    安装后的Rabbit MQ 监听端口默认是5672
    安装以后就可以在系统的开始菜单里找到RabbitMQ的启动菜单。开启管理插件(Web管理页面),rabbitmq-plugins enable rabbitmq_management
    laravel队列服务_第5张图片
    访问http://localhost:15672/,用户名密码都是guest。
    3.安装php中的ampq扩展
    下载相应版本ampg.dll版本
    https://pecl.php.net/package/amqp

php_amqp.dll扩展文件放入对应php版本的ext文件夹中,并且将rabbitmq.4.dll 文件复制到
php目录下K:\phpstudy_pro\Extensions\php\php7.3.4nts。在php.ini中添加 扩展项 extension=php_amqp.dll

二,laravel使用rabbitMQ

laravle使用rabbitMQ需要先安装rabbitMQ驱动

composer require vladimir-yuldashev/laravel-queue-rabbitmq

此处可能会报错
laravel队列服务_第6张图片
是因为laravel版本和驱动不匹配引起的,此处composer安装的是最新版
laravel队列服务_第7张图片

composer require vladimir-yuldashev/laravel-queue-rabbitmq:7.1

安装成功后修改相关配置文件
1.在config/app.php文件中,providers数组中添加

VladimirYuldashev\LaravelQueueRabbitMQ\LaravelQueueRabbitMQServiceProvider::class,

2.在app/config/queue.php文件中,connections数组中添加rabbitmq的驱动配置

'rabbitmq' => [
    'driver'                => 'rabbitmq',
 
    'host'                  => env('RABBITMQ_HOST', '127.0.0.1'),
    'port'                  => env('RABBITMQ_PORT', 5672),//5672默认端口
 
    'vhost'                 => env('RABBITMQ_VHOST', '/'),
    'login'                 => env('RABBITMQ_LOGIN', 'guest'),
    'password'              => env('RABBITMQ_PASSWORD', 'guest'),
 
    'queue'                 => env('RABBITMQ_QUEUE'), // name of the default queue,
 
    'exchange_declare'      => env('RABBITMQ_EXCHANGE_DECLARE', true), // create the exchange if not exists
    'queue_declare_bind'    => env('RABBITMQ_QUEUE_DECLARE_BIND', true), // create the queue if not exists and bind to the exchange
 
    'queue_params'          => [
        'passive'           => env('RABBITMQ_QUEUE_PASSIVE', false),
        'durable'           => env('RABBITMQ_QUEUE_DURABLE', true),
        'exclusive'         => env('RABBITMQ_QUEUE_EXCLUSIVE', false),
        'auto_delete'       => env('RABBITMQ_QUEUE_AUTODELETE', false),
    ],
 
    'exchange_params' => [
        'name'        => env('RABBITMQ_EXCHANGE_NAME', null),
        'type'        => env('RABBITMQ_EXCHANGE_TYPE', 'direct'), // more info at http://www.rabbitmq.com/tutorials/amqp-concepts.html
        'passive'     => env('RABBITMQ_EXCHANGE_PASSIVE', false),
        'durable'     => env('RABBITMQ_EXCHANGE_DURABLE', true), // the exchange will survive server restarts
        'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', false),
    ],
 
],

然后新增.env的配置项

# mq相关配置
RABBITMQ_HOST=127.0.0.1  #mq的服务器地址
RABBITMQ_PORT=5672  #mq的端口
RABBITMQ_VHOST=/
RABBITMQ_LOGIN=guest    #mq的登录名
RABBITMQ_PASSWORD=guest   #mq的密码
RABBITMQ_QUEUE=queue_name   #mq的队列名称

修改.env配置项

# redis切换成了rabbitMQ
QUEUE_CONNECTION=rabbitmq
# QUEUE_CONNECTION=redis

三,相关测试代码

1.创建任务类

php artisan make:job Notice

创建的任务类内容如下



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;

class Notice implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    protected $data;
    public function __construct($data)
    {
        //
        $this->data=$data;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //根据传参来生成txt文章类容
        $content="内容是".$this->data.",时间是".date('Y-m-d H:i:s',time());
        file_put_contents('./queueTest.txt',$content,FILE_APPEND);
    }
}

找一个方法来测试

 public function index(){
        $posts=Post::where('published_at', '<=', Carbon::now())//小于等于当前时间
            ->orderBy('published_at', 'desc')
            ->paginate(config('blog.posts_per_page'));
        $oneposts=Post::query()->first();
        //延迟60秒
        //$job=(new Notice($oneposts))->delay(60);
        $job=(new Notice($oneposts));
        $this->dispatch($job);
        return view('blog.index',compact('posts'));
    }

使用命令行来监听队列

php artisan queue:listen

然后请求这index方法会发现
在这里插入图片描述
查看命令行当前目录下,多出来一个queueTest.txt文件,并且内容就是$oneposts。表示成功。

你可能感兴趣的:(laravel)