lumen 8.0 使用 rabbitmq 队列

lumen rabbitmq 使用

安装rabbitmq

在Windows先安装,需要准备的资源如下:

  1. erlang
  2. rabbitmq-server

启动服务

win+R 输入services.msc,查看服务RabbitMQ, 启动该服务。

安装php amqp扩展

下载地址

修改php.ini

文件php_amqp.dll,php_amqp.pdb拷贝到php7.x.xext目录中,并修改配置文件php.ini

extension="D:\phpstudy_pro\Extensions\php\php7.4.3nts\ext\php_amqp.dll"

注意,记得重启nginx

安装插件

composer require vladimir-yuldashev/laravel-queue-rabbitmq

添加注册bootstrap/app.php

// mq注册
$app->register(VladimirYuldashev\LaravelQueueRabbitMQ\LaravelQueueRabbitMQServiceProvider::class);

配置config/app.php

 'rabbitmq'  => [
            'driver'        =>  'rabbitmq',
            'queue'         =>  env('RABBITMQ_QUEUE','default'),
            'connection'    =>  \PhpAmqpLib\Connection\AMQPLazyConnection::class,
            'hosts'         =>  [
                [
                    'host'      =>  env('RABBITMQ_HOST', '127.0.0.1'),
                    'port'      =>  env('RABBITMQ_PORT', '5672'),
                    'user'      =>  env('RABBITMQ_USER', 'guest'),
                    'password'  =>  env('RABBITMQ_PASSWORD', 'guest'),
                    'vhost'     =>  env('RABBITMQ_VHOST', '/'),
                ]
            ],

            'options'   =>  [
                'ssl_options' => [
                    'cafile'        => env('RABBITMQ_SSL_CAFILE', null),
                    'local_cert'    => env('RABBITMQ_SSL_LOCALCERT', null),
                    'local_key'     => env('RABBITMQ_SSL_LOCALKEY', null),
                    'verify_peer'   => env('RABBITMQ_SSL_VERIFY_PEER', true),
                    'passphrase'    => env('RABBITMQ_SSL_PASSPHRASE', null),
                ],
            ]
        ]

配置.env

QUEUE_CONNECTION=rabbitmq  #修改一下

RABBITMQ_HOST=127.0.0.1  #要连接的主机名
RABBITMQ_PORT=5672         #端口号
RABBITMQ_VHOST=/
RABBITMQ_LOGIN=guest       #mq登录名
RABBITMQ_PASSWORD=guest     #mq登录密码
RABBITMQ_QUEUE=cenhuqing         #mq连接的名称(随便写)

创建任务类

php artisan make:job TestQueue

具体代码如下:

<?php

namespace App\Jobs;

use App\Models\Post;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class TestQueue implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    private $data;

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function handle() {
        // 插入数据
        Post::create($this->data);
    }
}

创建控制器

<?php

namespace App\Http\Controllers;

use App\Jobs\TestQueue;

class ExampleController extends Controller
{
    public function store_with_mq(Request $request)
    {
        $message = [
            'title.required'    => '请输入标题',
            'title.string'      => '标题必须为字符串',
            'title.max'         => '标题最多 :max 字符',
            'content.required'  => '请输入内容',
            'content.string'    => '内容必须为字符串'
        ];
        $validator = Validator::make($request->input(), [
            'title'     => 'required|string|max:10',
            'content'   => 'required|string',
        ], $message);

        if ($validator->fails()) {
            foreach($validator->errors()->getMessages() as $error) {
                return resp(Code::CreateUserFailed, $error[0]);
            }
        }

        $attributes = $request->only('title', 'content');
        $attributes['user_id'] = 1; //auth()->user()->id;
        // 加入mq队列中
        $this->dispatch(new TestQueue($attributes));
        return resp(Code::CreatePostsSuccess, Msg::CreatePostsSuccess);
    }
}

创建路由

$router->post('/posts', 'ExampleController@store_with_mq');

启动队列

php artisan rabbitmq:consume
[2020-10-26 14:07:40][5b482036-1573-4ed3-a081-fc33565ee102] Processing: App\Jobs\TestQueue
[2020-10-26 14:07:40][5b482036-1573-4ed3-a081-fc33565ee102] Processed:  App\Jobs\TestQueue

请求测试

curl --location --request POST 'localhost:84/posts' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Cookie: laravel_session=go3wRgLpOKusZYLYz2ik27H1ZSjk0E5VxBYLliOI' \
--data-urlencode 'title=123' \
--data-urlencode 'content=123'

查看数据库

SELECT * FROM posts WHERE title = 123

    id  user_id  title   content  comment_count           created_at           updated_at  deleted_at  
------  -------  ------  -------  -------------  -------------------  -------------------  ------------
   203        1  123     123                  0  2020-10-26 22:07:40  2020-10-26 22:07:40        (NULL)
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
39
粉丝
9
喜欢
71
收藏
102
排名:461
访问:1.9 万
私信
所有博文
社区赞助商