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秒才执行,每次都是,我哪里写错了吗?下面是执行结果
复制你的代码,我执行的结果是成功的,如图:
如果你还是执行不成功,那就试试在Job中直接定义 public $timeout 变量: public $timeout = 10;