balambasik/throttler

限制任何操作

1.0.10 2022-01-21 21:06 UTC

This package is not auto-updated.

Last update: 2024-09-28 10:12:54 UTC


README

Throttler - 简单的 PHP 库。

设计用来限制任何动作。最小配置,最大简洁。

与 MySql 驱动和内存驱动兼容。添加你的驱动,实现 DriverInterface。

安装

composer require balambasik/throttler

使用示例

$driver = new MySQLDriver("localhost", "root", "", "throttler", "throttler");
$factory = new ThrottlerFactory($driver);

$registerThrottler = $factory
                ->id($_SERVER["REMOTE_ADDR"])
                ->tag("/api/register")
                ->waitSeconds(5)
                ->create();

// 1 request per 5 seconds per IP, per route - "/api/register"
if($registerThrottler->isLimit()){
    exit("Limit!")
} else {
  // handle request
}

// or -------------------------------------

$registerThrottler->isLimit(function(){
    exit("Limit!")
});

// handle request

多个实例

// 1 request per 5 seconds per IP, per route - "/api/register"
$registerThrottler = $factory
                ->id($_SERVER["REMOTE_ADDR"])
                ->tag("/api/register")
                ->waitSeconds(5)
                ->create();

// 1 request per 1 minute per IP, per route - "/api/forgot_password"              
$forgotThrottler = $factory
                ->id($_SERVER["REMOTE_ADDR"])
                ->tag("/api/forgot_password")
                ->waitMinutes(1)
                ->create();


$registerThrottler->isLimit(function(){
    exit("Limit!")
});


$forgotThrottler->isLimit(function(){
    exit("Limit!")
});

手动模式

默认情况下,方法 isLimit() 记录访问并检查是否达到限制。您可以分离这些操作。

// 1 request per 5 seconds per IP, per route - "/api/register"
$registerThrottler = $factory
                ->id($_SERVER["REMOTE_ADDR"])
                ->tag("/api/register")
                ->waitSeconds(5)
                ->createManualMode();

// set hit
$registerThrottler->hit();

// check limit
$registerThrottler->isLimit(function(){
    exit("Limit!")
});

MySql 驱动需要一张表。

CREATE TABLE IF NOT EXISTS `table_name` (
    `id` varchar(10),
    `tag` varchar(10),
    `wait` INT(11) UNSIGNED NOT NULL
    );

ALTER TABLE `table_name` ADD INDEX (`id`, `tag`);

或者一次调用 MySqlDriver 对象的 createTable() 方法

$MySQLDriver = new MySqlDriver("localhost", "login", "password", "dbName", "tableName");
$MySQLDriver->createTable();

内存驱动

InMemoryDriver 不需要任何配置。由于明显的原因,它无法在请求之间持久化状态。因此,使用它来保护路由是一个糟糕的主意。它非常适合限制单个请求内的操作。

$driver = new InMemoryDriver();
$factory = new ThrottlerFactory($driver);
// ...

许可证 - MIT。