应优先启用Laravel内置throttle中间件并配置Redis缓存驱动,通过路由级限流(如throttle:5,1)和自定义RateLimiter策略(如按X-Order-ID限流)实现精准控流,同时确保限流中间件在消息校验中间件之前执行。

当促销活动开启或热点事件爆发,Laravel应用突然遭遇数倍于日常的请求洪峰,数据库连接池瞬间打满、Redis响应延迟飙升、PHP-FPM进程耗尽——此时不是硬扛,而是要让系统主动“收窄通道”,把有限资源留给核心链路。
HTTP层限流:在请求入口处拦截
第一步:确认缓存驱动已切至 Redis。打开 .env 文件,检查 【CACHE_DRIVER=redis】 且 REDIS_HOST 可达;若仍用 file 或 array,限流在多 worker 下完全失效。
第二步:在 app/Http/Kernel.php 的 $middlewareGroups['api'] 中,确保 \Illuminate\Routing\Middleware\ThrottleRequests::class 已启用。
第三步:为关键接口路由添加限流中间件,例如登录接口每分钟最多 5 次:->middleware('throttle:5,1,login')。注意这里第三个参数是策略名,不是随便写的字符串,它会触发 Laravel 内部独立计数器。
第四步:对高敏感接口(如支付回调、库存扣减),必须自定义限流键——不能只按 IP 或用户 ID。比如在 AppServiceProvider 的 boot() 中注册:
RateLimiter::for('stock_deduction', function (Request $request) {
return Limit::perMinute(30)->by($request->header('X-Order-ID') ?: $request->ip());
});
然后路由中写 ->middleware('throttle:stock_deduction')。不加这一步,CDN 后所有请求会被当成同一个 IP 限死。
消息校验中间件:过滤非法请求
方法一:创建专用中间件
运行 php artisan make:middleware MessageValidationMiddleware,在 handle() 中优先校验:
— 请求体是否为空(!$request->getContent())
— 签名头是否缺失(!$request->header('X-Sign'))
— 文本长度是否超 10KB(strlen($request->getContent()) > 10240)
方法二:签名验证用 hash_hmac,别查数据库
计算签名:hash_hmac('sha256', $request->getContent(), config('app.key')),与 header 中的 X-Sign 对比。这一步必须在中间件里完成,控制器里做就晚了——非法请求已经占用了 PHP 进程。
方法三:注册顺序不能错
在路由组中,必须写成 ->middleware(['throttle:api', 'message.validation'])。限流必须在前,否则恶意构造的空请求会绕过 throttle 直接冲进校验逻辑,白白消耗资源。
队列任务降级:保护后台处理能力
第一步:为 high 队列单独部署 Supervisor 进程
编辑 supervisor.conf,新增 program 段落:
[program:laravel-high-worker]
这表示只允许 1 个 worker 处理 high 队列,硬性封顶。
第二步:启用 laravel-semaphore 控制并发上限
安装包:composer require ramsey/laravel-semaphore。
在 high 任务的 handle() 开头插入:Semaphore::attempt('high_task_limit', 2, function () { /* 原业务逻辑 */ });
其中 2 表示无论启动多少 worker,同一时刻最多只有 2 个 high 任务在执行。
第三步:失败超过 2 次自动降级到 low 队列
在任务类中重写 failed() 方法:
if ($this->attempts() >= 2) {
dispatch(new static(...$this->data))->onQueue('low');
return;
}
这样高优任务卡住时不会阻塞整个队列,低优任务仍能流动。
缓存与配置预热:减少运行时开销
上线前必须执行三项命令:php artisan config:cache → 合并所有配置为单文件php artisan route:cache → 避免每次请求解析路由composer dump-autoload --optimize → 加速类自动加载
OPcache 生产环境关键配置:
opcache.enable=1
opcache.memory_consumption=256
【opcache.validate_timestamps=0】
最后这一项必须关掉,否则每次请求都检查 PHP 文件修改时间,高并发下 I/O 成瓶颈。
缓存驱动选型:Redis 平均读取延迟 0.5ms,吞吐 10 万 QPS;Memcached 延迟更低但最终一致;本地缓存最快但节点间不共享。电商下单链路必须用 Redis,用户首页推荐可用本地缓存 + Redis 双写。


















