Php Laravel队列速率限制不执行工作
我正在尝试实现当队列作业遇到速率受限的外部API时使用的方法 这是我的工作:Php Laravel队列速率限制不执行工作,php,laravel,laravel-queue,Php,Laravel,Laravel Queue,我正在尝试实现当队列作业遇到速率受限的外部API时使用的方法 这是我的工作: public function handle() { echo 'about to check throttling'.PHP_EOL; Redis::throttle('throttle-test')->allow(10)->every(5)->then(function () { // this is never executed
public function handle() {
echo 'about to check throttling'.PHP_EOL;
Redis::throttle('throttle-test')->allow(10)->every(5)->then(function () {
// this is never executed
echo 'doing work'.PHP_EOL;
}, function () {
// also never executed
echo 'released back onto queue'.PHP_EOL;
return $this->release(10);
});
}
除了“…应用程序可以与Redis服务器交互”之外,文档中没有提到需要将Redis用于队列、缓存或任何类似性质的内容
DB_CONNECTION=mysql
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
REDIS_HOST=redis
我已确认,RedisServiceProvider
正在接收其期望的正确配置:
array:3 [
"client" => "predis"
"default" => array:4 [
"host" => "redis"
"password" => null
"port" => "6379"
"database" => 0
]
"horizon" => array:5 [
"host" => "redis"
"password" => null
"port" => "6379"
"database" => 0
"options" => array:1 [
"prefix" => "horizon:"
]
]
]
我很难理解为什么没有运行时错误,只是什么都没有执行。如果我把节流阀的东西注释掉,工作就会正常运行,并完成它应该做的事情关于使用此节流的要求,我遗漏了什么?在这种情况下,Laravel的文档非常容易误导。虽然这意味着您只需要连接到
Redis
,但实际上您必须为队列使用Redis
。不幸的是,在不使用Redis
队列驱动程序的情况下,没有“官方”方法对队列进行分级限制
我编写了自定义队列工作程序,它使用illighted\Cache\RateLimiter
对作业执行进行分级限制(与Laravel to内部使用的相同)
阅读更多关于其在或中使用的信息。检查
存储/logs/laravel.log
最后一行,队列通常以静默方式失败,但在发生错误时写入日志。检查存储/loogs/laravel.log
最后一行,队列通常以静默方式失败,但在发生错误时写入日志。在laravel文档中,它说速率限制。此功能要求您的应用程序可以与Redis服务器交互。
因此,由于您使用的是QUEUE\u DRIVER=sync
,您的队列永远不会被Redis处理,因此它永远不会被执行。速率限制是REDIS独有的功能。与REDIS服务器交互
和使用REDIS作为队列
是两件不同的事情。我认为,如果需要将Redis用作队列,它会指定一个队列。我已确认Redis商店信息已正确传递给RedisServiceProvider
您是否尝试将Redis
用作.env
文件中的队列驱动程序?否!如果使用速率限制器,则不需要在队列中使用redis。这个答案不正确!