必须设$cfg['ServerDefault']=0且$cfg['Servers']索引从1开始连续,否则登录下拉列表仅显示第一个服务器;手动$i++易跳号或重复导致后续配置失效。

phpMyAdmin 5.2 不支持直接“平滑迁移”多服务器配置——它本身不提供运行时热加载或配置热更新机制,所谓“平滑”只能指迁移后登录界面立刻显示所有服务器、不报错、不丢连接,且无需反复重启 Web 服务。关键在 config.inc.php 的索引组织方式是否严格符合 5.2 的解析逻辑。
为什么 $i++ 手动递增常导致只显示一个服务器
phpMyAdmin 5.2 仍沿用经典数组索引校验:每个 $cfg['Servers'][$i] 必须使用从 1 开始的**连续整数索引**,且不能跳号、不能重复、不能为 0 或负数。手动写 $i = 0; $i++; ... $i++; 容易因复制粘贴、条件分支或意外重置导致索引中断(比如漏掉一次 $i++),后续配置就被跳过或覆盖。
- 现象:登录页下拉列表仅出现第一个服务器,或空白,
error_log里可能有Undefined index: 2类警告 - 真实原因不是“不兼容”,而是
$cfg['Servers'][2]根本没被赋值,phpMyAdmin 遍历到1就停了 - 5.2 对索引连续性比 4.x 更敏感,尤其启用了
$cfg['ServerDefault'] = 0时
必须用循环初始化,且索引从 1 开始硬编码
官方 examples/config.manyhosts.inc.php 在 5.2 中依然有效,但需注意两点:循环变量必须显式设为 1 起始,且不能依赖外部变量污染作用域。
- 正确写法:
for ($i = 1; $i - 错误写法:
$i = 0; foreach ($hosts as $host) { $i++; $cfg['Servers'][$i]['host'] = $host; }—— 看似等价,但若$hosts为空,$i会变成1却无实际赋值,触发静默失败 - 5.2 不再容忍
$cfg['Servers'][0],哪怕你只定义了[1]和[2],中间缺[3]也会让[4]及之后失效
迁移前必须清理 runtime 缓存与 session 数据
phpMyAdmin 5.2 默认启用 $cfg['TempDir'] 缓存(如 /var/lib/phpmyadmin/tmp),旧版本残留的缓存文件可能包含已失效的服务器连接元数据,导致新配置不生效。
立即学习“PHP免费学习笔记(深入)”;
- 执行
rm -rf /var/lib/phpmyadmin/tmp/*(路径以你的$cfg['TempDir']为准) - 清空浏览器中 phpMyAdmin 的所有 Cookie,特别是
pma_lang、pma_collation和server相关项 - 如果用了 PHP session 存储(非 files),确认
session.save_path下无陈旧sess_*文件干扰认证流程 - Apache/Nginx 不需要 reload,但 PHP-FPM 进程若长期运行,建议
systemctl reload php*-fpm确保读取新配置
最易被忽略的是索引的“连续性”和“起始值”——5.2 不报错,但静默截断;别信“看起来能连上就对了”,务必逐个点开下拉菜单里的每个服务器,看左侧数据库列表是否正常加载,而不是只测第一个。



















