phpMyAdmin的$cfg['Servers']是索引从1开始的PHP数组,非模板变量;须用foreach等原生循环动态填充,禁止Twig/Blade语法,且每个子数组至少含'host'和'extension'。

phpMyAdmin 的 $cfg['Servers'] 是普通 PHP 数组,不是模板语法变量
很多人误以为 $cfg['Servers'] 支持类似 Twig 或 Blade 的循环语法(比如 {% for %}),实际它只是标准 PHP 配置数组。你不能在 config.inc.php 里写 {% for server in servers %} —— 这会直接导致 PHP 解析失败或空白页。
真正可行的方式是用原生 PHP 的 foreach 或 for 构建数组元素,再赋值给 $cfg['Servers']。前提是:所有服务器配置结构一致,且你有明确的元数据源(如数组、JSON、环境变量)。
-
$cfg['Servers']必须是索引从 1 开始的数组(phpMyAdmin 强制要求,$cfg['Servers'][0]会被忽略) - 每个子数组必须包含至少
'host'和'extension'(旧版用'auth_type'等) - 动态生成前,确保没有重复的
'host'+'port'组合,否则登录时可能选错实例
用 foreach 循环填充 $cfg['Servers'] 的实操写法
假设你有三套 MySQL 实例运行在不同端口,统一用 root 登录,可这样写:
$server_list = [
['host' => '127.0.0.1', 'port' => '3306', 'verbose' => 'Local default'],
['host' => '127.0.0.1', 'port' => '3307', 'verbose' => 'Local test'],
['host' => '10.0.2.10', 'port' => '3306', 'verbose' => 'Staging DB'],
];
$i = 1;
foreach ($server_list as $item) {
$cfg['Servers'][$i]['host'] = $item['host'];
$cfg['Servers'][$i]['port'] = $item['port'];
$cfg['Servers'][$i]['verbose'] = $item['verbose'];
$cfg['Servers'][$i]['auth_type'] = 'cookie'; // 或 'config',但 config 不安全
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = ''; // 生产环境严禁硬编码密码
$cfg['Servers'][$i]['extension'] = 'mysqli';
$i++;
}
注意:$i 从 1 开始递增,不能用 array_push() 或 [] 追加,否则键名不对,phpMyAdmin 会跳过。
- 若需区分认证方式,把
'auth_type'提到$server_list里作为字段更灵活 - 避免在循环中调用
getenv()或file_get_contents()—— 配置文件加载阶段不支持复杂 I/O - 修改后务必清空浏览器 cookie 和 phpMyAdmin 的 session 目录,否则旧服务器列表可能缓存残留
从环境变量或 JSON 文件读取服务器列表的风险点
有人想把服务器信息外置到 .env 或 servers.json,技术上可行,但 phpMyAdmin 的配置加载时机很早,很多扩展(如 dotenv)尚未初始化。强行加载容易报 Undefined variable 或 Call to undefined function。
- 推荐做法:用 shell 脚本预生成
config.inc.php(CI/CD 中执行),而不是运行时解析 - 若坚持用 JSON,必须用
file_exists()+json_decode(file_get_contents(...), true),且确保路径是绝对路径(__DIR__ . '/servers.json') - JSON 中不能出现注释、尾随逗号、单引号 —— 否则
json_decode()返回null,整个$cfg['Servers']变空,登录页直接报错No servers configured
$cfg['Servers'] 动态生成后不生效?先查这三项
最常踩的坑不是逻辑错,而是配置未被正确加载或覆盖:
- 确认你编辑的是 phpMyAdmin 实际加载的
config.inc.php—— 多版本共存时容易改错路径,可用grep -r "\$cfg\['Servers'\]" /usr/share/phpmyadmin/定位 - 检查是否有其他地方重写了
$cfg['Servers'],比如插件、自定义config.user.inc.php,PHP 的变量赋值是覆盖式而非合并式 - 浏览器控制台若报
Failed to load resource: the server responded with a status of 500,说明 PHP 解析出错,此时要开error_reporting(E_ALL); ini_set('display_errors', 1);查原始错误
动态生成本身不难,难的是让整个加载链路干净、可追溯、无隐式覆盖 —— 尤其当团队多人维护或跨环境部署时,硬编码反而比“自动”更可靠。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











