本教程详细阐述了在phpMyAdmin中配置多个数据库服务器的方法,旨在解决登录界面无法正确显示服务器下拉列表的问题。通过分析常见的配置误区,并提供官方推荐的循环配置模式及示例代码,帮助用户高效管理本地和远程数据库实例,确保phpMyAdmin能够正确识别并列出所有已配置的服务器。
问题背景:phpMyAdmin多服务器配置挑战
在管理多个数据库环境时,例如同时操作本地开发数据库和远程docker实例,phpmyadmin是一个常用的工具。然而,许多用户在尝试配置多个数据库服务器时,会遇到登录界面无法正确显示服务器下拉列表的问题。常见的现象包括:phpmyadmin只显示一个服务器、显示空白页面,或者在尝试手动调整 $i 变量时出现异常行为。
最初的尝试可能是在 /etc/phpmyadmin/config.inc.php 文件中,通过复制粘贴配置块并手动递增 $i 来添加服务器。例如,将一个服务器的配置放在 if 语句块中,然后尝试在外部或另一个 if 块中配置第二个服务器,并期待 $i 的递增能使其生效。然而,这种手动且分散的配置方式往往会导致phpMyAdmin无法正确识别和加载所有服务器,从而无法在登录界面提供服务器选择下拉框。
phpMyAdmin多服务器配置核心原理
phpMyAdmin通过读取 config.inc.php 文件中的 $cfg[‘Servers’] 数组来识别和管理所有可用的数据库服务器。这个数组是一个关联数组,其键值通常从 1 开始递增,每个键对应一个独立的服务器配置。理解其核心原理是成功配置多服务器的关键:
- 索引从1开始: $cfg[‘Servers’] 数组的第一个服务器配置应该使用 $cfg[‘Servers’][1],而不是 $cfg[‘Servers’][0]。
- 独立的配置块: 每个服务器的配置都应该是一个独立的配置块,包含其特有的连接参数、认证方式、显示名称等。
- 自动化管理: 对于多个服务器,最推荐且最健壮的方法是使用循环结构(如 foreach)来遍历一个服务器列表,并为每个服务器动态生成配置。这避免了手动管理索引 $i 可能导致的错误。
标准多服务器配置实践
为了正确地在phpMyAdmin中配置多个服务器,并确保登录界面显示服务器下拉列表,推荐采用以下标准配置模式。这种模式通常可以在phpMyAdmin的官方示例配置文件(如 config.manyhosts.inc.php)中找到。
核心思想是定义一个包含所有服务器主机地址的数组,然后通过循环遍历这个数组,为每个主机地址生成一个独立的服务器配置。
立即学习“PHP免费学习笔记(深入)”;
示例代码:配置多个数据库服务器
以下是一个经过优化的 config.inc.php 配置示例,展示了如何同时配置本地服务器和docker容器中的数据库实例:
<?php /* * This is needed for Cookie based authentication to work. * If not set (or less than 32 chars), the user is not logged out anymore and * an error "wrong cookie pass parameter" appears. */ $cfg['blowfish_secret'] = 'your_strong_secret_phrase_here_at_least_32_chars'; // 替换为至少32个字符的强密码 /* * Servers configuration */ $i = 0; // 初始化服务器索引 // $cfg['Servers'] 数组从 $cfg['Servers'][1] 开始。不要使用 $cfg['Servers'][0]。 // 可以通过将 host 设置为 '' 来禁用某个服务器配置条目。 // 定义所有需要配置的服务器主机列表 $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'] = ''; $cfg['Servers'][$i]['connect_type'] = 'tcp'; // 连接类型:tcp 或 socket $cfg['Servers'][$i]['extension'] = 'mysqli'; // 推荐使用 mysqli 扩展 // 认证与显示设置 $cfg['Servers'][$i]['auth_type'] = 'cookie'; // 认证方式:cookie, config, http, signon $cfg['Servers'][$i]['user'] = ''; // 'cookie' 认证时此处留空,登录时输入 $cfg['Servers'][$i]['password'] = ''; // 'cookie' 认证时此处留空 $cfg['Servers'][$i]['verbose'] = ($host === 'localhost') ? '本地数据库' : 'Docker数据库'; // 服务器在下拉列表中的显示名称 // phpMyAdmin高级功能配置(可选,但推荐) // 需要在数据库中创建 phpmyadmin 数据库和相关的控制表 $cfg['Servers'][$i]['controluser'] = 'pma'; // 用于phpMyAdmin高级功能的控制用户 $cfg['Servers'][$i]['controlpass'] = 'pmapass'; // 控制用户密码 $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]['designer_coords'] = 'pma__designer_coords'; $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]['export_templates'] = 'pma__export_templates'; // 其他可选设置 $cfg['Servers'][$i]['compress'] = FALSE; // 是否启用压缩 $cfg['Servers'][$i]['only_db'] = ''; // 如果只想显示特定数据库,可在此指定 // $cfg['Servers'][$i]['AllowNoPassword'] = TRUE; // 允许无密码登录,出于安全考虑通常不推荐 } // 确保 $cfg['blowfish_secret'] 已设置 if (empty($cfg['blowfish_secret'])) { $cfg['blowfish_secret'] = 'A_VERY_LONG_AND_RANDOM_STRING_HERE_AT_LEAST_32_CHARS'; } ?>
关键参数解释:
- $cfg[‘blowfish_secret’]: 一个至少32个字符的随机字符串,用于cookie加密。这是phpMyAdmin正常运行和安全性的关键。
- $hosts: 一个包含所有服务器地址的PHP数组。
- $cfg[‘Servers’][$i][‘host’]: 数据库服务器的IP地址或主机名。如果包含端口,如 172.18.0.1:3307,则 $cfg[‘Servers’][$i][‘port’] 可以留空。
- $cfg[‘Servers’][$i][‘port’]: 数据库服务器的端口号。如果主机名中已包含,此处可为空。
- $cfg[‘Servers’][$i][‘connect_type’]: 连接类型,通常为 ‘tcp’。
- $cfg[‘Servers’][$i][‘extension’]: PHP用于连接MySQL的扩展,推荐使用 ‘mysqli’。
- $cfg[‘Servers’][$i][‘auth_type’]: 认证方式。
- ‘cookie’: 登录时通过Web界面输入用户名和密码,最常用且推荐。
- ‘config’: 在 config.inc.php 中直接配置用户名和密码 ($cfg[‘Servers’][$i][‘user’] 和 $cfg[‘Servers’][$i][‘password‘])。不推荐用于生产环境,因为密码明文存储。
- $cfg[‘Servers’][$i][‘verbose’]: 服务器在phpMyAdmin登录界面下拉列表中的显示名称,方便用户识别。
- $cfg[‘Servers’][$i][‘controluser’] / $cfg[‘Servers’][$i][‘controlpass’]: 这是phpMyAdmin用于存储高级功能(如书签、历史记录、关系图等)元数据的控制用户凭据。强烈建议为phpMyAdmin创建一个专门的数据库和用户,以实现这些高级功能。
- $cfg[‘Servers’][$i][‘pmadb’]: phpMyAdmin控制数据库的名称,通常为 phpmyadmin。
注意事项
- 索引起始: 再次强调,$cfg[‘Servers’] 数组的索引必须从 1 开始,0 是无效的。
- 安全性:
- 务必设置一个强壮且唯一的 blowfish_secret。
- 对于生产环境,推荐使用 ‘cookie’ 认证方式,避免在配置文件中明文存储数据库用户密码。
- 谨慎使用 $cfg[‘Servers’][$i][‘AllowNoPassword’] = TRUE;,这会允许无密码登录,存在严重安全风险。
- 控制用户和数据库: 为了充分利用phpMyAdmin的高级功能,请务必创建一个名为 phpmyadmin 的数据库,并导入phpMyAdmin提供的 examples/create_tables.sql 脚本来创建控制表。然后创建一个具有相应权限的用户(如 pma)作为控制用户。
- 扩展选择: 现代PHP环境应优先使用 mysqli 扩展。如果你的PHP环境较旧或有特定需求,可能需要使用 mysql(但已不推荐)。
- 端口配置: 如果数据库服务器使用非标准端口(如Docker实例),确保在 host 参数中包含端口(IP:端口)或在 port 参数中单独指定。
- Valet环境兼容性: 像Valet这样的本地开发工具可能会改变phpMyAdmin的访问URL(例如从 localhost/phpmyadmin 变为 phpmyadmin.test)。这通常是通过Valet的站点配置实现的,与 config.inc.php 中的多服务器配置逻辑是独立的。多服务器配置解决的是phpMyAdmin内部识别多个数据库连接的问题,而不是访问phpMyAdmin本身的URL问题。
总结
通过遵循上述标准的多服务器配置模式,您可以轻松地在phpMyAdmin中管理多个数据库实例。使用循环结构自动化服务器配置,不仅能提高配置效率,还能避免手动错误,确保phpMyAdmin登录界面能够正确显示所有已配置的服务器列表,从而为您的数据库管理工作带来极大的便利。请务必关注安全性设置,并根据需要配置phpMyAdmin的高级功能。
评论(已关闭)
评论已关闭