我正在尝试限制documentation中所说的繁重操作。当允许操作时-它会迅速燃烧。
但是,当操作达到油门限制时-等待约3秒钟,然后触发油门回调。这是代码:
Artisan::command('temp', function () {
Illuminate\Support\Facades\Log::debug("Start temp");
Illuminate\Support\Facades\Redis::throttle("test123")
->allow(1)
->every(5)
->then(function () {
Illuminate\Support\Facades\Log::debug("Logged immediately when allowed");
}, function () {
Illuminate\Support\Facades\Log::debug("Logged after ~3 seconds on throttle");
});
Illuminate\Support\Facades\Log::debug("Logged immediately or after ~3 seconds depending on above");
});
我希望on throttle
回调也会立即触发。有办法解决吗?
答案 0 :(得分:0)
当我面对同样的问题时,我弄清楚了为什么要花这么长时间-
看Illuminate\Redis\Limiters\DurationLimiterBuilder
,我们看到:
/**
* The amount of time to block until a lock is available.
*
* @var int
*/
public $timeout = 3;
...
/**
* Set the amount of time to block until a lock is available.
*
* @param int $timeout
* @return $this
*/
public function block($timeout)
{
$this->timeout = $timeout;
return $this;
}
因此,从理论上讲,您只需要添加->block(1)
,或者如果您正在使用作业,并且延迟重新排队它们,则也可以使用0。
(实际上,我必须清除缓存并做了composer dump-autoload
才能使它工作)
此外,如果您使用redis-cli monitor
命令,则会看到缓存中正在发生的情况,非常适合调试。