imi-rate-limit
— это компонент ограничения скорости для фреймворка imi
, разработанный на основе bandwidth-throttle/token-bucket
.
Этот компонент поддерживает только использование Redis
в качестве промежуточного программного обеспечения и может ограничивать скорость методов и интерфейсов, устанавливая общую ёмкость, количество токенов, генерируемых за единицу времени, и количество токенов, вычитаемых при каждом использовании.
Проект можно установить с помощью composer, следуя правилам автоматической загрузки psr-4. Добавьте следующее содержимое в ваш файл composer.json
:
{
"require": {
"imiphp/imi-rate-limit": "~1.0"
}
}
Затем выполните команду composer update
для установки.
В файле проекта config/config.php
настройте:
[
'components' => [
// 引入本组件
'RateLimit' => 'Imi\RateLimit',
],
'pools' => [
// 一定得要配置 Redis 连接池才可以用
],
'redis' => [
'defaultPool' => 'redis连接池名称',
],
]
Используйте:
/**
* Ограничивает одновременный доступ до 3 раз в секунду.
*
* @Action
*
* @RateLimit(name="test1", capacity=3)
*
* @return void
*/
public function test1()
{
return [
'data' => 'test1',
];
}
/**
* Ограничивает одновременный доступ до одного раза в секунду и ожидает снятия ограничения перед продолжением выполнения. Время ожидания составляет 1 секунду.
*
* @Action
*
* @RateLimit(name="test2", capacity=1)
* @BlockingConsumer(1)
*
* @return void
*/
public function test2()
{
return [
'data' => 'test2',
];
}
/**
* Общая ёмкость составляет 1000, каждый миллисекунду добавляется 1 токен, а при каждом вызове вычитается 500 токенов.
*
* Пользовательская обработка ограничений.
*
* @Action
*
* @RateLimit(name="test3", capacity=1000, fill=1, unit="millisecond", deduct=500, callback="\ImiDemo\HttpDemo\Util\RateLimitParser::parse")
*
* @return void
*/
public function test3()
{
return [
'data' => 'test3',
];
}
/**
* Ручной вызов ограничения скорости.
*
* Общая ёмкость составляет 1000, каждый миллисекунда добавляется 1 токен, при каждом вызове вычитается 500 токенов.
*
* @Action
*
* @return void
*/
public function test4()
{
if(true !== $result = RateLimiter::limit('test4', 1000, function(){
// Возвращаемое значение пользовательского обратного вызова будет возвращено как исходное возвращаемое значение метода.
return [
'message' => 'Пользовательский возврат при срабатывании ограничения скорости',
];
}, 1, 'millisecond', 500))
{
return $result;
}
return [
'data' => 'test4',
];
}
/**
* Ручной вызов ограничения скорости.
*
* Ограничение одновременного доступа до одного раза в секунду, ожидание снятия ограничения перед выполнением. Время ожидания составляет одну секунду.
*
* @Action
*
* @return void
*/
public function test5()
{
if(true !== $result = RateLimiter::limitBlock('test5', 1, function(){
// Возвращаемое значение пользовательского обратного вызова будет возвращено как исходное возвращаемое значение метода.
return [
'message' => 'Пользовательское сообщение при срабатывании ограничения скорости',
];
}, 1, 1, 'second', 1))
{
return $result;
}
return [
'data' => 'test5',
];
}
QQ группа: 17916227 , если у вас есть вопросы, вам помогут и исправят ошибки.
imi-rate-limit
распространяется под лицензией MIT и доступен для бесплатного использования.
Открытый исходный код не требует прибыли, сколько бы ни было, это всё от души, жизнь непроста, так что просто плывите по течению...
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )