phpMyAdmin多服务器配置必须保证$cfg['Servers']索引连续、字段完整且语法正确,推荐用foreach循环或Docker环境变量自动注入,并统一使用auth_type='cookie'模式。
config.inc.php 里直接写死多个 $cfg['Servers'][$i] 会失效
手动复制粘贴配置块、靠人眼递增 $i 是最常见也最易出错的做法。phpmyadmin 启动时会顺序遍历 $cfg['servers'] 数组,一旦遇到语法错误、空值或索引断续(比如跳过 [2] 直接写 [3]),后续所有服务器配置都会被丢弃 —— 这就是为什么改完配置后只显示一个服务器,甚至登录页空白。
关键点不是“写了几个”,而是“能不能被完整加载”。必须保证:
-
$cfg['Servers'][1]、$cfg['Servers'][2]、$cfg['Servers'][3]连续存在,不能缺号也不能重复 - 每个索引下必须有完整的
host、auth_type等必要字段,漏掉host或auth_type就触发#2002 Cannot log in to the MySQL server - 整个 PHP 文件语法必须合法,哪怕多一个逗号、少一个分号,
config.inc.php就解析失败,phpMyAdmin 回退到默认单机配置
用 foreach 循环生成服务器配置才是可靠方式
官方示例 config.manyhosts.inc.php 的核心逻辑就是靠循环自动分配索引,避免人为失误。它不依赖全局 $i 变量,也不怕条件分支干扰。
实际操作只需三步:
- 定义一个服务器描述数组,比如:
$hosts = ['localhost:3306', '192.168.1.100:3307', '/var/run/mysqld/mysqld.sock'] - 用
foreach遍历,每次循环内$cfg['Servers'][++$i]自增并赋值 - 每个循环体内填入完整参数:固定写
'auth_type' => 'cookie',按需填host、port或socket,verbose用来显示名称
示例片段(可直接插入 config.inc.php 底部):
立即学习“PHP免费学习笔记(深入)”;
<?php
$i = 0;
$hosts = [
['host' => 'localhost', 'port' => 3306, 'verbose' => 'Local Dev'],
['host' => '10.0.2.15', 'port' => 3307, 'verbose' => 'Staging DB'],
['socket' => '/var/run/mysqld/mysqld.sock', 'verbose' => 'Docker Host']
];
foreach ($hosts as $h) {
$i++;
$cfg['Servers'][$i]['host'] = $h['host'] ?? '';
$cfg['Servers'][$i]['port'] = $h['port'] ?? '';
$cfg['Servers'][$i]['socket'] = $h['socket'] ?? '';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['verbose'] = $h['verbose'];
}
Docker Compose 环境下优先用环境变量驱动
在容器编排场景中,硬编码 config.inc.php 不仅难维护,还违背不可变基础设施原则。phpMyAdmin 镜像原生支持通过 PMA_HOSTS、PMA_PORTS 等环境变量注入多服务器信息。
只要确保:
-
PMA_HOSTS和PMA_PORTS值数量一致,用英文逗号分隔,顺序一一对应 -
PMA_VERBOSES可选,但建议加上,否则下拉列表只显示 IP/端口,不易区分 - 容器启动时这些变量已注入,phpMyAdmin 启动阶段就会自动生成
$cfg['Servers']数组
docker-compose.yml 片段示例:
environment:
PMA_HOSTS: db1,db2,db3
PMA_PORTS: 3306,3307,3308
PMA_VERBOSES: Primary,Backup,Analytics
PMA_USER: root
PMA_PASSWORD: ${DB_ROOT_PASSWORD}
注意:PMA_USER 和 PMA_PASSWORD 是全局凭据,所有服务器共用;若需不同账号,仍得回退到 config.inc.php 手动配置。
auth_type 设为 'cookie' 是唯一能支撑多服务器切换的模式
auth_type = 'http' 在多服务器场景下基本不可用 —— Web 服务器统一做 HTTP Basic Auth,phpMyAdmin 拿不到用户意图连哪台 MySQL,也无法动态切换 $cfg['Servers'][$i] 中的凭据。
auth_type = 'config' 虽然能写死账号密码,但明文暴露风险高,且无法区分服务器粒度的权限控制。
真正可行的只有 'cookie':
- 登录页出现服务器下拉框,用户先选目标实例,再输该实例对应的账号密码
- 凭据由 session 管理,不落地、不共享,每台服务器独立认证
- 配合
AllowNoPassword和host/socket组合,可实现免密本地连接 + 密码远程连接的混合策略
别试图绕过这个限制。任何想用 http 或 config 实现“一键切服务器”的方案,最终都会卡在凭据路由环节。
复杂点在于 socket 和 TCP 连接混用时容易配错字段 —— 填了 host 就别同时填 socket,否则 phpMyAdmin 会优先走 socket 通道,可能绕过网络层权限校验,导致连接拒绝却报错模糊。



















