毎日laravel-20160624|RateLimiter
3141 ワード
<?php
namespace Illuminate\Cache;
use Illuminate\Contracts\Cache\Repository as Cache;
// declare namespace
class RateLimiter
{// RateLimiter
/**
* The cache store implementation.
*
* @var \Illuminate\Contracts\Cache\Repository
*/
protected $cache;// a interface instance
/**
* Create a new rate limiter instance.
*
* @param \Illuminate\Contracts\Cache\Repository $cache
* @return void
*/
public function __construct(Cache $cache)
{
$this->cache = $cache;
}// a big set to init a class, instance about cache.
/**
* Determine if the given key has been "accessed" too many times.
* Determine whether to add many times
* @param string $key
* @param int $maxAttempts
* @param int $decayMinutes
* @return bool
*/
public function tooManyAttempts($key, $maxAttempts, $decayMinutes = 1)// increment too Many Attempts
{
if ($this->cache->has($key.':lockout')) {
return true;
}// check lockout,
if ($this->attempts($key) > $maxAttempts) {
$this->cache->add($key.':lockout', time() + ($decayMinutes * 60), $decayMinutes);
return true;
}// to change the access weight
return false;
}// done is to back true, or back false
/**
* Increment the counter for a given key for a given decay time.
*
* @param string $key
* @param int $decayMinutes
* @return int
*/
public function hit($key, $decayMinutes = 1)
{
$this->cache->add($key, 1, $decayMinutes);
return (int) $this->cache->increment($key);
}// to add a increment time, increment
// this is hit function to change time
/**
* Get the number of attempts for the given key.
*
* @param string $key
* @return mixed
*/
public function attempts($key)
{
return $this->cache->get($key, 0);
}// get value by 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);// try to get value
return $attempts === 0 ? $maxAttempts : $maxAttempts - $attempts + 1;
}// a retirsleft ,a left times
/**
* Clear the hits and lockout for the given key.
*
* @param string $key
* @return void
*/
public function clear($key)
{
$this->cache->forget($key);
$this->cache->forget($key.':lockout');
}// clear the hit and forget key and forget an shadow key,that is $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') - time();
}// has the time back, get the can be used times
}