ratelimiter php,RateLimiter.php

namespace Illuminate\Cache;

use Illuminate\Support\InteractsWithTime;

use Illuminate\Contracts\Cache\Repository as Cache;

class RateLimiter

{

use InteractsWithTime;

/**

* The cache store implementation.

*

* @var \Illuminate\Contracts\Cache\Repository

*/

protected $cache;

/**

* Create a new rate limiter instance.

*

* @param \Illuminate\Contracts\Cache\Repository $cache

* @return void

*/

public function __construct(Cache $cache)

{

$this->cache = $cache;

}

/**

* Determine if the given key has been "accessed" too many times.

*

* @param string $key

* @param int $maxAttempts

* @param float|int $decayMinutes

* @return bool

*/

public function tooManyAttempts($key, $maxAttempts, $decayMinutes = 1)

{

if ($this->cache->has($key.':lockout')) {

return true;

}

if ($this->attempts($key) >= $maxAttempts) {

$this->lockout($key, $decayMinutes);

$this->resetAttempts($key);

return true;

}

return false;

}

/**

* Add the lockout key to the cache.

*

* @param string $key

* @param int $decayMinutes

* @return void

*/

protected function lockout($key, $decayMinutes)

{

$this->cache->add(

$key.':lockout', $this->availableAt($decayMinutes * 60), $decayMinutes

);

}

/**

* Increment the counter for a given key for a given decay time.

*

* @param string $key

* @param float|int $decayMinutes

* @return int

*/

public function hit($key, $decayMinutes = 1)

{

$this->cache->add($key, 0, $decayMinutes);

return (int) $this->cache->increment($key);

}

/**

* Get the number of attempts for the given key.

*

* @param string $key

* @return mixed

*/

public function attempts($key)

{

return $this->cache->get($key, 0);

}

/**

* Reset the number of attempts for the given key.

*

* @param string $key

* @return mixed

*/

public function resetAttempts($key)

{

return $this->cache->forget($key);

}

/**

* Get the number of retries left for the given key.

*

* @param string $key

* @param int $maxAttempts

* @return int

*/

public function retriesLeft($key, $maxAttempts)

{

$attempts = $this->attempts($key);

return $maxAttempts - $attempts;

}

/**

* Clear the hits and lockout for the given key.

*

* @param string $key

* @return void

*/

public function clear($key)

{

$this->resetAttempts($key);

$this->cache->forget($key.':lockout');

}

/**

* Get the number of seconds until the "key" is accessible again.

*

* @param string $key

* @return int

*/

public function availableIn($key)

{

return $this->cache->get($key.':lockout') - $this->currentTime();

}

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值