lumen 8.0 使用 rabbitmq 队列
lumen rabbitmq 使用
安装rabbitmq
在Windows先安装,需要准备的资源如下:
启动服务
win+R
输入services.msc
,查看服务RabbitMQ
, 启动该服务。
安装php amqp
扩展
修改php.ini
文件php_amqp.dll
,php_amqp.pdb
拷贝到php7.x.x
的ext
目录中,并修改配置文件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 协议》,转载必须注明作者和本文链接
谢谢分享!!!