laravel11 队列中的速率限制按使用教程方法Redis::throttle不按规定时间去执行

1. 运行环境

WSL2

1). 当前使用的 Laravel 版本?

11.19.0

2). 当前使用的 php/php-fpm 版本?

PHP 版本:PHP 8.3.4
php-fpm 版本:8.3.4

3). 当前系统

Windows 11

4). 业务环境

开发环境

2. 问题描述?

<?php

namespace App\Jobs;

use App\Jobs\Middleware\RateLimited;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;

class SendWxWork implements ShouldQueue
{
    use Queueable;

    public int $tries = 0;

    /**
     * Create a new job instance.
     */
    public function __construct(protected int $uid, protected string $message)
    {
    }

    /**
     * Execute the job.
     */
    public function handle(): void
    {
        echo $this->uid;
        echo $this->message . PHP_EOL;
    }

    public function middleware(): array
    {
        return [new RateLimited];
    }
}

上面定义了一个SendWxWork队列使用了中间件去限速比如每10秒最多执行7个任务

<?php declare(strict_types=1);

namespace App\Jobs\Middleware;

use Closure;
use Illuminate\Support\Facades\Redis;

class RateLimited
{
    public function handle(object $job, Closure $next): void
    {
        Redis::throttle('key')
            ->block(0)->allow(7)->every(10)
            ->then(function () use ($job, $next) {
                $next($job);
            }, function () use ($job) {
                $job->release(10);
            });
    }
}

然后我在路由试着去执行他,看看他会不会按期望去执行

<?php

use App\Jobs\SendWxWork;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    for ($i = 0; $i < 10; $i++) {
        SendWxWork::dispatch($i, 'hello work');
    }
});

按理说执行7条后,等10秒,后面3条应该就马上执行,但是每次都是有要等64秒才去执行,->allow(7)->every(10)这里无论设置成->allow(2)->every(1)还是什么的,都是第64秒才执行,每次都是,我哪里写错了吗?下面是执行结果

Laravel

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3

复制你的代码,我执行的结果是成功的,如图:

file

如果你还是执行不成功,那就试试在Job中直接定义 public $timeout 变量: public $timeout = 10;

6个月前 评论
season886 (楼主) 6个月前
福寿绵绵 (作者) 6个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!