文件session在高并发下会拖慢请求,因其依赖flock()独占锁导致同一用户并发请求串行化,且gc扫描和磁盘i/o随并发线性增长;redis内存访问延迟稳定在0.1–0.3ms,500并发时实测响应时间仍稳定在11ms,比文件快5倍以上。

快不快,得看场景——在高并发、多节点、Session读写频繁的系统里,Redis 存储能比文件快 3~10 倍;但在单机低流量、每次只读不写的页面(比如静态首页),几乎看不出差别。
为什么文件 Session 在高并发下会拖慢整个请求
PHP 默认用 flock() 对每个 sess_* 文件加独占锁。这意味着:同一用户的两个并行 AJAX 请求,第二个必须等第一个调用 session_write_close() 或脚本结束才能继续——哪怕第二个请求根本没碰 $_SESSION。
- 锁是进程级的,不是会话级的;即使只读也会触发写锁(因为 PHP 默认开启
session.cache_limiter) - 当
session.save_path下有上万个 Session 文件时,gc()扫描过程本身就会卡住 PHP-FPM worker 进程 - 磁盘 I/O 随并发线性增长,而 Redis 是内存随机访问,延迟稳定在 0.1–0.3ms
PHP 8.2 + Redis 的实测性能拐点在哪
我们用相同硬件(4C8G,Ubuntu 22.04,PHP-FPM static 模式)压测一个只做 session_start() + echo $_SESSION['uid'] ?? 'guest' 的接口:
- 50 并发时,文件 vs Redis:平均响应时间 18ms vs 9ms(快 2 倍)
- 500 并发时,文件开始出现超时和 502,Redis 仍稳定在 11ms(实际快 5 倍以上)
- 当
session.gc_probability = 1(每次请求都触发垃圾回收)且文件数 > 5k 时,文件方案 P99 延迟飙升到 1200ms,Redis 无明显波动
配置不对,Redis 也快不起来
常见掉坑点:
-
session.save_path写成tcp://127.0.0.1:6379?auth=xxx,但没开 Redis 的protected-mode no或密码不匹配 → 请求卡死在连接阶段,表现像“变慢” - PHP 8.2 用了 NTS 版本的
php_redis.dll,却运行在 TS(线程安全)模式下 → 扩展加载失败,悄悄回退到文件存储,日志里只有一句Failed to initialize storage module - 没设
redis.session.locking_enabled = 1(PHP 8.2+ 默认关闭),导致并发写入时数据覆盖 —— 看似快了,实则丢数据 - Redis 持久化策略选了
appendonly yes但磁盘是机械硬盘 → AOF fsync 拖累吞吐,建议生产环境用appendfsync everysec
真正决定快慢的,从来不是“换没换 Redis”,而是锁怎么管、GC 怎么控、扩展有没有静默失效——这些细节一错,你连“快多少”都测不出来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











