phpMyAdmin 会话默认存在 PHP 配置的 session.save_handler 所指定位置,通常是 /tmp;因其本身不管理会话存储,仅依赖 PHP 的会话配置,故不能直接切 Redis,需修改 PHP 的 session.save_handler=redis 等相关设置。
phpMyAdmin 会话默认存在哪?为什么不能直接切 Redis
phpmyadmin 本身不管理会话存储,它完全依赖 php 的 session.save_handler 配置。也就是说,改的是 php,不是 phpmyadmin 的某个配置项。如果你只在 config.inc.php 里瞎加 redis 设置,会话照旧写进 /tmp,毫无作用。
常见错误现象:phpinfo() 显示 session.save_handler 还是 files;登录后换服务器就掉登录;多节点部署时反复跳转到登录页。
- 确认当前 handler:运行
php -i | grep session.save_handler或查phpinfo()输出 - Redis 要求 PHP 已启用
redis或phpredis扩展(不是predis这类纯 PHP 客户端) - PHP 版本 ≥ 7.0 推荐用
redis扩展;8.0+ 注意扩展是否兼容(如某些旧版phpredis不支持 PHP 8.2)
怎么让 PHP 把会话存进 Redis(单实例)
核心是改 PHP 的会话处理器,不是 phpMyAdmin 的配置文件。修改位置取决于你的部署方式:如果是系统级 PHP(如 Ubuntu 的 /etc/php/*/apache2/php.ini),改对应 ini;Docker 中则需挂载自定义 php.ini 或用 ini_set()(不推荐)。
关键配置项:
session.save_handler = redis-
session.save_path = "tcp://127.0.0.1:6379?database=2&auth=mypass"(注意&是 HTML 实体,实际写 ini 时用&) -
session.cookie_httponly = 1(安全建议,防止 XSS 窃取 session cookie) - 别漏掉
session.gc_maxlifetime,要和 Redis 的 key 过期时间对齐(比如设为 1440,Redis 就别设成 600)
示例完整段落(放进 php.ini):
立即学习“PHP免费学习笔记(深入)”;
session.save_handler = redis session.save_path = "tcp://redis-prod:6379?database=2&auth=prod-secret" session.cookie_httponly = 1 session.gc_maxlifetime = 1440
高可用场景下 Redis 连接怎么写才不单点失效
PHP 原生 redis handler 不支持 Redis Cluster 或 Sentinel 自动故障转移。强行写多个地址如 "tcp://r1:6379,tcp://r2:6379" 会报错或只连第一个——这是最常踩的坑。
可行方案只有两个:
- 用
redis-sentinel模式(需 PHP redis 扩展 ≥ 5.3.2):session.save_path = "sentinel://mymaster@sentinel1:26379,sentinel2:26379?retry_interval=100",并确保redis.sentinel_master_name在 ini 中设好 - 更稳的做法:前端加个 Redis 代理(如
twemproxy或redis-exporter + haproxy),让 PHP 只认一个 VIP 或域名,故障切换由代理层处理 - 避免用
unix:///path/to/redis.sock—— 高可用架构下本地 socket 失去意义,且多数容器环境不挂载 socket 文件
phpMyAdmin 本身要不要配 session 相关选项
基本不用。phpMyAdmin 的 $cfg['Servers'][$i]['auth_type'] 是认证方式(cookie/http/config),和会话存储位置无关。唯一需要留意的是:$cfg['LoginCookieValidity'] 应 ≤ PHP 的 session.gc_maxlifetime,否则用户还没操作完,服务端 session 就被删了,导致中途登出。
容易忽略的细节:
- 如果用了
auth_type = http,会话由 Web 服务器(如 Apache)控制,PHP 的 session 配置完全无效 - 所有节点的
session.hash_function和session.hash_bits_per_character必须一致,否则同一 session_id 在不同机器上解不出来 - Redis 中的 session key 默认以
PHPREDIS_SESSION:开头,可被其他 PHP 应用误删——生产环境建议用独立 database 或加前缀(通过save_path的database参数隔离)
事情说清了就结束










