php 8.1 高并发稳态核心是限流在前、释放要快、资源不卡、异步兜底:收紧 php-fpm 配置防雪崩,严控数据库连接与 session 文件锁,用 redis 缓存和 fiber 并发提升吞吐。

PHP-FPM 必须收紧,防子进程雪崩
默认 pm.max_children=50 很危险——若单请求占 120MB 内存,50 个就吃掉 6GB,触发 OOM Kill。必须按真实内存配:
- 算清单请求平均内存(用
memory_get_peak_usage()日志采样),再设pm.max_children = floor(可用内存 × 0.7 / 单请求内存) - 选
pm = static更稳;若用dynamic,务必设严:pm.start_servers、pm.min_spare_servers、pm.max_spare_servers差值不超过 5 - 强制加
pm.max_requests = 300–800,防止长期运行积累内存泄漏 - 开启
request_terminate_timeout = 25s和request_slowlog_timeout = 8s,超时立即杀,记慢日志定位卡点
数据库连接不能放任自流
每个 PHP-FPM 进程默认独占一个 MySQL 连接,max_children=30 就可能打满 MySQL 的 max_connections,报 “Too many connections” 直接崩。
- PHP 里查完立刻关:
$pdo = null或mysqli::close(),别等脚本结束 - 读多写少接口,强制走 Redis 缓存,加
Cache-Control: public, max-age=30,减少穿透 - 写操作捕获
PDOException,遇到连接拒绝(SQLSTATE[2002])或超限(SQLSTATE[08004]),立刻返回503 Service Unavailable+Retry-After: 2 - 下单类关键接口,前置 Redis 计数器限流:
INCR order_limit:20260927+EXPIRE,超阈值直接拒
Session 和文件操作是隐形杀手
默认 session.save_handler = files 在高并发下会因文件锁阻塞,session_start() 可能卡 3 秒以上,拖垮整条链路。
- 切到 Redis 存 session:
session.save_handler = redis,session.save_path = "tcp://127.0.0.1:6379?database=2" - API 接口、登录页等无需写 session 的场景,尽早调用
session_write_close()释放写锁 - 上传临时目录
upload_tmp_dir必须指向 SSD 分区,且open_basedir别限制过死,否则move_uploaded_file()失败不报错只静默卡住
用 Fiber 做轻量异步,别等全栈重构
PHP 8.1 原生支持 Fiber,不用装 Swoole 也能把 I/O 等待“挂起”,提升单机吞吐。
- 对多个 API 调用、Redis 查询、DB 查询等 I/O 操作,封装成 Fiber 并发执行,避免串行等待
- 示例:启动 3 个 Fiber 并行查用户、订单、优惠券,主流程用
foreach ($fibers as $f) $f->start()启动,再resume()收集结果 - 注意:Fiber 需配合非阻塞 I/O 扩展(如
ext-curl的 multi 模式或ext-redis的 pipeline)才真正有效,纯阻塞函数挂起也没用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











