前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >webman 官方限流组件 1.0 发布!

webman 官方限流组件 1.0 发布!

作者头像
Tinywan
发布2024-12-19 18:47:46
发布2024-12-19 18:47:46
8900
代码可运行
举报
文章被收录于专栏:开源技术小栈
运行总次数:0
代码可运行

简介

webman限流器,支持注解限流。 支持apcu、redis、memory驱动。

安装

代码语言:javascript
代码运行次数:0
复制
composer require webman/rate-limiter

使用

代码语言:javascript
代码运行次数:0
复制
<?php

namespace app\controller;

use Webman\RateLimiter\Annotation\RateLimiter;
use Webman\RateLimiter\Limiter;

/**
 * test-users 
 */
class UserController
{

    #[RateLimiter(limit: 10)]
    public function index(): string
    {
        // 默认为IP限流,默认单位时间为1秒
        return '每个ip每秒最多10个请求';
    }

    #[RateLimiter(limit: 100, ttl: 60, key: RateLimiter::UID)]
    public function search(): string
    {
        // key: RateLimiter::UID,以用户ID为维度进行限流,要求session('user.id')不为空
        return '每个用户每分钟最多100次搜索';
    }

    #[RateLimiter(limit: 1, ttl: 60, key: RateLimiter::SID, message: '每人每分钟只能发一次邮件')]
    public function sendMail(): string
    {
        // key: RateLimiter::SID,以session_id为维度进行限流
        return '每人每分钟只能发一次邮件';
    }

    #[RateLimiter(limit: 100, ttl: 24 * 60 * 60, key: 'coupon', message: '今天的优惠券已经发完,请明天再来')]
    public function coupon(): string
    {
        // key: 'coupon', 这里coupon为自定义key,也就是全局以coupon为key进行限流
        return '优惠券发送成功';
    }

    public function sendCms(string $mobile): string
    {
        // 当key为变量时,可以使用如下代码手动限流,这里mobile作为key
        Limiter::check($mobile, 5, 24 * 60 * 60, '每个手机号一天最多5条短信');
        return '短信发送成功';
    }

    #[RateLimiter(limit: 5, ttl: 24 * 60 * 60, key: [UserController::class, 'getMobile'], message: '每个手机号一天最多5条短信')]
    public function sendCms2(): string
    {
        // 当key为变量时,可以使用[类, 方法]的方式获取key,例如[UserController::class, 'getMobile']会调用UserController的getMobile()方法的返回值为key
        return '短信发送成功';
    }

    /**
     * 自定义key,获取手机号
     * @return string
     */
    public static function getMobile(): string
    {
        return request()->get('mobile');
    }

}

配置

开源技术小栈config/plugin/webman/rate-limiter/app.php

代码语言:javascript
代码运行次数:0
复制
<?php
return [
    'enable' => true,
    'driver' => 'auto', // auto, apcu, memory, redis
    'stores' => [
        'redis' => [
            'connection' => 'default',
        ]
    ],
    // 这些ip的请求不做频率限制
    'ip_whitelist' => [
        //'127.0.0.1',
    ],
];
  • enable:是否开启限流
  • driverauto,apcu,memory,redis中的一个值,使用auto时会自当在apcuredis中选一个值
  • stores:redis配置connection对应config/redis.php中对应的值
  • ip_whitelist:白名单的ip不会被限流(只在key为RateLimiter::IP时有效)

driver选择

memory

  • 介绍:无需安装任何扩展,性能最好。
  • 使用限制:限流只对当前进程有效,多个进程间不共享限流数据,同时也不支持集群限流。
  • 试用场景:windows开发环境、不需要严格限流的业务、抵御CC攻击时。

apcu

  • 安装扩展:当driver使用apcu时,需要安装apcu扩展,并且php.ini中设置
代码语言:javascript
代码运行次数:0
复制
apc.enabled=1
apc.enable_cli=1

如果不知道php.ini位置,可以通过命令php --ini寻找php.ini的位置

  • 介绍:性能略低于memory,支持多进程共享限流数据。
  • 使用限制:不支持集群
  • 使用场景:任何开发环境、线上单机限流场景;、集群不需要严格限流的场景、抵御CC攻击。

redis

  • 依赖:需要安装redis扩展,并安装Redis组件,安装命令
代码语言:javascript
代码运行次数:0
复制
composer require -W illuminate/redis illuminate/events
  • 介绍:性能低于apcu,支持单机也支持集群精确限流
  • 适用场景:开发环境、线上单机环境、集群环境。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 安装
  • 使用
  • 配置
  • driver选择
    • memory
    • apcu
    • redis
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档