
本教程旨在解决phpMyAdmin无法正确显示和管理多个数据库服务器的问题。通过分析常见的配置误区,我们提供了一个基于config.manyhosts.inc.php示例的标准化解决方案,详细讲解了如何利用循环结构在config.inc.php文件中正确配置多个MySQL/MariaDB服务器,确保所有连接均能在登录界面下拉列表中显示,从而实现高效的多服务器管理。
phpMyAdmin多服务器配置问题解析
在使用phpmyadmin管理多个数据库服务器时,开发者常遇到一个困扰:即使在config.inc.php文件中添加了多个服务器配置,phpmyadmin登录界面也可能只显示一个服务器,或者出现空白页面的异常。这通常是由于对phpmyadmin配置数组$cfg[‘servers’]的索引处理不当,以及对不同服务器配置块的组织方式理解有误导致的。
例如,直接在配置文件中通过手动递增 $i 变量来定义服务器,或者混合使用动态(如通过外部变量$dbname、$dbserver等)和静态配置,往往会导致索引冲突或配置被覆盖。phpMyAdmin要求每个服务器配置都必须拥有一个唯一的、从1开始递增的数字索引。如果索引处理不当,后续的配置可能会覆盖之前的配置,或者导致phpMyAdmin无法正确解析所有服务器信息,进而无法在登录界面展示服务器选择下拉列表。
正确的phpMyAdmin多服务器配置方法
为了解决上述问题,phpMyAdmin官方推荐使用一种结构化的方式来配置多个服务器,即通过一个循环来动态生成每个服务器的配置块。这种方法确保了每个服务器都拥有独立的配置,并且索引处理得当。这种模式在phpMyAdmin的安装目录下的examples/config.manyhosts.inc.php示例文件中可以找到。
核心思想是创建一个包含所有服务器主机地址的数组,然后遍历这个数组,为每个主机地址生成一个独立的服务器配置。
配置示例与详解
以下是根据官方推荐并结合实际需求优化的多服务器配置示例。请将此代码段添加到您的phpMyAdmin配置文件(通常是/etc/phpmyadmin/config.inc.php或/usr/share/phpmyadmin/config.inc.php)中。
立即学习“PHP免费学习笔记(深入)”;
<?php
// 初始化服务器索引。phpMyAdmin的服务器数组从1开始。
$i = 0;
// 定义所有需要管理的数据库主机列表。
// 可以包含主机名、IP地址,如果端口不是默认的3306,请在主机名后加上冒号和端口号。
$hosts = [
'localhost', // 本地MySQL服务器
'172.18.0.1:3307' // Docker容器或其他远程MySQL服务器,指定IP和端口
];
// 遍历主机列表,为每个主机生成独立的服务器配置
foreach ($hosts as $host) {
$i++; // 每次循环递增服务器索引
// 基本连接参数
$cfg['Servers'][$i]['host'] = $host;
$cfg['Servers'][$i]['port'] = ''; // 如果主机名已包含端口,此处留空
$cfg['Servers'][$i]['socket'] = ''; // 如果使用TCP连接,此处留空
$cfg['Servers'][$i]['connect_type'] = 'tcp'; // 连接类型:tcp 或 socket
$cfg['Servers'][$i]['extension'] = 'mysqli'; // 推荐使用mysqli扩展
// 认证方式
// 'cookie':通过登录表单输入用户名密码
// 'config':在配置文件中硬编码用户名密码(安全性较低,不推荐用于生产环境)
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = ''; // 如果auth_type是'config',在此处填写用户名
$cfg['Servers'][$i]['password'] = ''; // 如果auth_type是'config',在此处填写密码
// 服务器在phpMyAdmin登录界面下拉列表中的显示名称
// 可以根据实际情况自定义,例如 '本地开发环境' 或 'Docker数据库'
if ($host == 'localhost') {
$cfg['Servers'][$i]['verbose'] = '本地MySQL';
} elseif ($host == '172.18.0.1:3307') {
$cfg['Servers'][$i]['verbose'] = 'Docker实例数据库 (172.18.0.1:3307)';
} else {
$cfg['Servers'][$i]['verbose'] = $host; // 默认显示主机名
}
// phpMyAdmin高级功能配置(可选,推荐配置以获得完整功能)
// 这些是phpMyAdmin内部用于存储书签、关系、历史等功能的数据库和表。
// 通常需要创建一个名为 'phpmyadmin' 的数据库,并导入phpMyAdmin提供的SQL脚本。
$cfg['Servers'][$i]['controluser'] = 'pma'; // phpMyAdmin控制用户
$cfg['Servers'][$i]['controlpass'] = 'pmapass'; // phpMyAdmin控制用户密码
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin'; // phpMyAdmin控制数据库
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
// 其他可选设置
$cfg['Servers'][$i]['compress'] = FALSE; // 是否启用压缩连接
$cfg['Servers'][$i]['only_db'] = ''; // 如果只想显示特定数据库,在此处填写数据库名
// $cfg['Servers'][$i]['AllowNoPassword'] = TRUE; // 允许无密码登录(不推荐)
}
?>
配置参数详解:
- $i = 0;: 初始化服务器索引计数器。phpMyAdmin的$cfg[‘Servers’]数组是1-indexed,所以我们在循环开始时先递增 $i。
- $hosts: 这是一个包含所有数据库服务器地址的数组。每个元素可以是主机名(如localhost)或IP地址:端口(如172.18.0.1:3307)。
- $cfg[‘Servers’][$i][‘host’]: 数据库服务器的主机地址。
- $cfg[‘Servers’][$i][‘port’]: 数据库服务器的端口。如果主机地址中已包含端口,此处可以留空。
- $cfg[‘Servers’][$i][‘connect_type’]: 连接类型,通常为tcp。
- $cfg[‘Servers’][$i][‘extension’]: 使用的PHP数据库扩展,推荐mysqli。
- $cfg[‘Servers’][$i][‘auth_type’]: 认证方式。
- cookie:最常用且推荐的方式,用户在phpMyAdmin登录界面输入用户名和密码。
- config:用户名和密码硬编码在配置文件中。方便但不安全,不建议在生产环境使用。
- $cfg[‘Servers’][$i][‘user’] / $cfg[‘Servers’][$i][‘password‘]: 当auth_type为config时,此处填写数据库用户名和密码。
- $cfg[‘Servers’][$i][‘verbose’]: 服务器在phpMyAdmin登录界面下拉列表中的显示名称,建议设置为易于识别的名称。
- $cfg[‘Servers’][$i][‘controluser’] / $cfg[‘Servers’][$i][‘controlpass’] / $cfg[‘Servers’][$i][‘pmadb’]: 这些是phpMyAdmin高级功能所需的配置。为了使用书签、关系图等功能,您需要创建一个专门的数据库(通常命名为phpmyadmin)和一个拥有足够权限的控制用户(例如pma),并导入phpMyAdmin提供的create_tables.sql脚本。
注意事项
- 配置文件路径:请确保修改的是phpMyAdmin正在使用的config.inc.php文件。常见的路径包括/etc/phpmyadmin/config.inc.php (Debian/Ubuntu) 或phpMyAdmin安装目录下的config.inc.php。
- 权限问题:确保Web服务器(如Apache或Nginx)运行用户对config.inc.php文件有读取权限。
- 高级功能配置:如果需要使用phpMyAdmin的高级功能(如书签、关系图等),务必按照上述示例配置controluser、controlpass和pmadb,并确保pmadb数据库已创建且相关表已导入。
- 安全考虑:避免在生产环境中使用auth_type = ‘config’,因为它将数据库凭据硬编码在配置文件中。始终优先使用auth_type = ‘cookie’。
- Valet等本地开发环境:像Valet这样的本地开发工具可能会改变phpMyAdmin的访问URL(例如从localhost/phpmyadmin到phpmyadmin.test),但这不会影响config.inc.php中多服务器配置的逻辑。只要配置文件正确,phpMyAdmin就能通过其新的访问URL正常工作。
总结
通过采用结构化的循环配置方式,您可以轻松地在phpMyAdmin中管理多个数据库服务器。这种方法不仅解决了服务器无法显示的问题,还提高了配置的可维护性和清晰度。遵循本文提供的示例和注意事项,您将能够高效地利用phpMyAdmin的强大功能来管理您的所有MySQL/MariaDB数据库实例。
以上就是phpMyAdmin多服务器管理配置指南的详细内容,更多请关注php中文网其它相关文章!