济南行知网网站建设网站建设制作好评语
济南行知网网站建设,网站建设制作好评语,可以做贺卡的网站,企业门户网站建设方案文档PHP 的 API 速率限制#xff08;Rate Limiting#xff09;先说问题没有限速 → 爬虫/攻击者无限请求 → 服务器打挂有了限速 → 每个用户每分钟最多100次 → 保护系统---四种算法1. 固定窗口 - 最简单class FixedWindowLimiter {public function allow(string $key, int $lim…PHP的API速率限制Rate Limiting 先说问题 没有限速 → 爬虫/攻击者无限请求 → 服务器打挂 有了限速 → 每个用户每分钟最多100次 → 保护系统---四种算法1.固定窗口-最简单classFixedWindowLimiter{publicfunctionallow(string$key,int$limit):bool{$windowfloor(time()/60);// 每60秒一个窗口$redisKeyratelimit:$key:$window;$count$this-redis-incr($redisKey);if($count1)$this-redis-expire($redisKey,60);return$count$limit;}}// 问题窗口边界突刺// 59秒发100次 61秒发100次 2秒内200次请求通过 ✗---2.滑动窗口-解决边界突刺classSlidingWindowLimiter{publicfunctionallow(string$key,int$limit,int$window60):bool{$nowmicrotime(true);$redisKeysw:$key;$this-redis-multi()-zRemRangeByScore($redisKey,0,$now-$window)// 删过期记录-zAdd($redisKey,$now,$now)// 记录本次请求-zCard($redisKey)// 统计窗口内数量-expire($redisKey,$window)-exec();$count$this-redis-zCard($redisKey);return$count$limit;}}// 真正的最近60秒内不超过N次无边界问题// 代价每次请求写一条记录高并发下内存占用较大---3.令牌桶-允许突发流量classTokenBucketLimiter{// 桶容量100每秒补充10个令牌publicfunctionallow(string$key,int$capacity100,float$rate10):bool{$nowmicrotime(true);$datajson_decode($this-redis-get(bucket:$key)?:{},true);$tokens$data[tokens]??$capacity;$lastRefill$data[last_refill]??$now;// 补充令牌距上次时间 × 速率$tokensmin($capacity,$tokens($now-$lastRefill)*$rate);if($tokens1)returnfalse;// 没令牌拒绝$this-redis-setex(bucket:$key,3600,json_encode([tokens$tokens-1,last_refill$now,]));returntrue;}}// 平时攒令牌突发时可以一次消耗多个// 适合允许短暂爆发但长期均速的场景---4.漏桶-强制均匀输出classLeakyBucketLimiter{publicfunctionallow(string$key,int$capacity100,float$rate10):bool{$nowmicrotime(true);$datajson_decode($this-redis-get(leaky:$key)?:{},true);$queue$data[queue]??0;$lastLeak$data[last_leak]??$now;// 漏水距上次时间 × 速率$queuemax(0,$queue-($now-$lastLeak)*$rate);if($queue$capacity)returnfalse;// 桶满溢出拒绝$this-redis-setex(leaky:$key,3600,json_encode([queue$queue1,last_leak$now,]));returntrue;}}// 无论多少请求进来出口速率恒定// 适合保护下游服务强制匀速调用---多维度限流生产必备classMultiDimensionLimiter{publicfunctioncheck(Request$request):void{$ip$request-ip();$userId$request-userId();$route$request-route();$rules[[ip:$ip,60,100],// IP级60秒100次[user:$userId,60,200],// 用户级60秒200次[route:$route,1,1000],// 接口级1秒1000次[global,1,10000],// 全局1秒1万次];foreach($rulesas[$key,$window,$limit]){if(!$this-limiter-allow($key,$limit,$window)){thrownewTooManyRequestsException(触发限流$key限制$limit/$window秒);}}}}---响应头告知客户端classRateLimitMiddleware{publicfunctionhandle(Request$req,callable$next):Response{$keyuser:.$req-userId();$limit100;$remain$this-limiter-remaining($key,$limit);if($remain0){returnresponse(429,Too Many Requests,[Retry-After$this-limiter-resetIn($key),X-RateLimit-Limit$limit,X-RateLimit-Remaining0,]);}$response$next($req);$response-headers([X-RateLimit-Limit$limit,X-RateLimit-Remaining$remain,X-RateLimit-Reset$this-limiter-resetAt($key),]);return$response;}}---四种算法选哪个 场景 推荐算法 ──────────────────────────────────────── 简单限流快速上线 固定窗口 精确限流无边界突刺 滑动窗口 允许突发长期均速 令牌桶 ← 最常用 保护下游强制匀速输出 漏桶---一句话 限流选算法令牌桶最常用多维度叠加IP/用户/接口/全局响应头告知客户端剩余次数和重试时间。