littlebookboy/laravel-request-queue

帮助您轻松将每个请求派送到队列,并记录相关数据。

1.4 2017-05-26 07:49 UTC

This package is auto-updated.

Last update: 2024-09-14 13:23:25 UTC


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

配置

可设置 driverbase_url

失败的作业

失败的消息可以使用官方的数据库

php artisan queue:failed-table

php artisan migrate

请注意,队列监听中,当有程序变更需要重启监听才会生效。

处理请求可以在 app/Jobs/RequestQueueJobs.php 中的 handle 进行逻辑处理。