phpMyAdmin会话由PHP统一控制,必须配置PHP的session.save_handler=redis和session.save_path,并启用redis扩展、重启PHP-FPM;config.inc.php中任何redis相关设置均无效。
phpMyAdmin 会话根本不由自己控制,改的是 PHP 的 session.save_handler
phpmyadmin 没有独立的 session 配置项,它完全复用 php 运行时的会话设置。你改 config.inc.php 里的任何 redis 相关字段(比如加 $cfg['servers'][$i]['session_save_path'])都无效——php 根本不认这个键。真正起作用的只有 php 自身的 session.save_handler 和 session.save_path。
常见错误现象:php -i | grep session.save_handler 输出仍是 files;多台 phpMyAdmin 节点之间登录态无法共享;Nginx 负载均衡后频繁跳回登录页。
- 确认当前 handler:运行
php -i | grep session.save_handler或访问phpinfo()页面查输出 - 必须确保 PHP 已加载
redis扩展(不是predis),且版本兼容(PHP 8.2+ 需 redis 扩展 ≥ 5.3.7) - 扩展未启用时,
session.save_handler = redis会被静默忽略,降级回files
LNMP 下必须完成的三步:装 Redis、启扩展、改 php.ini
在 Ubuntu/Debian 环境下(CentOS 类似,仅包名略有差异):
- 安装 Redis 服务:
sudo apt install redis-server && sudo systemctl enable --now redis-server - 安装 PHP Redis 扩展:
sudo apt install php-redis(自动注册extension=redis.so) - 修改对应 PHP 的
php.ini(注意是 FPM 的配置,非 CLI):
路径通常为/etc/php/*/fpm/php.ini,确认后追加以下四行:
session.save_handler = redis session.save_path = "tcp://127.0.0.1:6379?database=2&auth=mypass" session.cookie_httponly = 1 session.gc_maxlifetime = 1440
⚠️ 注意:& 是 INI 文件中的字面量,不是 HTML 实体;database=2 表示使用 Redis DB 2;auth 参数仅当 Redis 配置了 requirepass 时才需要。
高可用部署时别硬写多个地址,sentinel 才是正解
原生 PHP redis handler 不支持 Redis Cluster,也不支持逗号分隔的多地址(如 "tcp://r1:6379,tcp://r2:6379"),那样只会连第一个且无故障转移能力。
正确做法是启用 Redis Sentinel 模式(要求 PHP redis 扩展 ≥ 5.3.2):
- 在 Redis 配置中部署至少 3 个 Sentinel 实例,并定义主节点别名(如
mymaster) - 将
session.save_path改为:sentinel://mymaster@sentinel1:26379,sentinel2:26379?retry_interval=100 - 确保 PHP 进程能解析
sentinel1等主机名(或直接填 IP) - 测试连接:
redis-cli -p 26379 -a sentinel-pass SENTINEL get-master-addr-by-name mymaster
容易被忽略的关键对齐点:session.gc_maxlifetime 和 Redis TTL
PHP 的 session.gc_maxlifetime 决定了 session_destroy() 或 GC 清理的阈值,但它**不控制 Redis key 的过期时间**——Redis key 的 TTL 由 PHP 扩展内部根据该值自动设置。
如果只改了 session.gc_maxlifetime = 1440(24 分钟),但 Redis 实例全局设置了 maxmemory-policy allkeys-lru,且内存吃紧,key 可能被提前驱逐;更隐蔽的问题是:若你在 Redis 里手动执行 EXPIRE 覆盖了 PHP 设置的 TTL,会导致会话提前失效。
务必做到:
-
session.gc_maxlifetime和session.cookie_lifetime语义一致,建议设为相同值 - 不要在 Redis 侧额外干预 session key 的过期逻辑(如用
SET key val EX 600替代SETEX) - 上线前用
redis-cli KEYS "PHPREDIS_SESSION:*"+TTL抽样验证实际过期时间
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











