littlebookboy / laravel-request-queue
帮助您轻松将每个请求派送到队列,并记录相关数据。
Requires
- guzzlehttp/guzzle: ~6.2.3
- littlebookboy/laravel-request-recorder: ~1.2
- predis/predis: ~1.1
README
说明
提供一种简单的方法将 request 派送到队列,并使用 Redis(或 MySQL)数据库存储队列工作。队列工作的监听通过 supervisord 辅助背景监听。
安装
使用 composer 安装包
composer require littlebookboy/laravel-request-queue
注册服务提供者
LittleBookBoy\Request\Queue\RequestQueueServiceProvider::class,
发布
php artisan vendor:publish
MySQL
php artisan queue:table
php artisan migrate
Redis
选择两种数据库之一使用,本项目默认使用 Redis
本地环境
安装 Redis Server,以下以 Mac 为例,可以参考官网的 installing-redis-on-mac-os-x 安装
brew update && brew install redis
启动 Redis Server
redis-server
后台执行可用
redis-server --daemonize yes
确认已启动 Redis Server,使用此指令来列出当前关于 redis-server 的常驻命令
ps aux | grep redis-server
启动 CLI,会看到默认的 redis 连接是 127.0.0.1:6379
redis-cli
127.0.0.1:6379>
项目环境
因为我是用 MAMP 环境,所以必须让它的 PHP 支持 Redis,可以参考这个说明去安装 panxianhai/php-redis-mamp,里面也有直接放好该有的 redis.so,不用自己去 php.net 手动编译出来。修改 php.ini,若是 MAMP Pro,打开 php.ini 可以在 File > Edit Template > PHP > PHP 7.0.8 php.ini
找到。
[redis]
extension="redis.so"
重启 MAMP 后打开 phpinfo 看,有出现 redis 表示 MAMP 中的 PHP 库已支持 Redis,而 Laravel 已经有一套很完整的机制可以让你快速连接到你本机的 Redis,在这个项目中,我使用的是 predis/predis 这个包。
示例
假设你现在有一个项目默认的 User model 与 users 数据表,里面有一个 id 为 1 的用户数据;
如果记录到相同的请求识别 id
X-Correlation-ID
时,会响应 409 告诉请求方,表示识别 id 发生冲突。
如果是通过 AJAX 发送请求,要添加 Header 告诉系统我是用 AJAX 传递数据,不然测试时,会遇到 request 参数收不到的情况,请参考
Content-Type: x-www-form-urlencoded
接收请求路由
队列工作启动条件目前设置为 patch, put, delete 三种请求会进行请求响应的处理流程
// patch, put, delete
Route::resource('user', 'UserController', ['only' => ['store', 'update', 'destroy']]);
请求 callback 参数
请求时传入包含
_callback_url
与_callback_token
两个参数,系统会响应 202,表示请求已接受,并将实际请求派送到队列中进行处理,并在处理后调用_callback_url
这个地址。如果没有发送
_callback_url
与_callback_token
时,系统会直接处理该请求,并回响应请求方,这种做法请求方需要等待响应。
callback 路由,将原始请求的请求识别 id 返回到 callback 地址
Route::post('callback_receiver', function (\Illuminate\Http\Request $request) {
// 驗證 token
...
// log the callback header
Log::info(collect($request->header())->toJson());
});
测试用控制器,处理 202 之后的队列工作
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Support\Facades\Hash;
class UserController extends Controller
{
public function update()
{
$user = User::find(1);
$user->name = str_random(20);
$user->email = str_random(20) . '@littlebookboy.dev';
$user->password = Hash::make(str_random(8));
$user->remember_token = Hash::make(str_random(100));
$user->update();
}
}
设置队列监听
/path/to/bin/php /path/to/project/artisan queue:work connection --queue=job:name
本例设置
/path/to/bin/php /path/to/project/artisan queue:work redis --queue=api:request
配置
可设置 driver
与 base_url
失败的作业
失败的消息可以使用官方的数据库
php artisan queue:failed-table
php artisan migrate
请注意,队列监听中,当有程序变更需要重启监听才会生效。
处理请求可以在 app/Jobs/RequestQueueJobs.php
中的 handle
进行逻辑处理。