phpMyAdmin 用户偏好默认存于 MySQL 的 pma__userconfig 表中,需启用高级功能并统一指向中心数据库;跨服务器同步必须共用该表及 controluser,且登录方式不能为 config 模式。
phpMyAdmin 用户偏好存在哪?
很多朋友可能没留意,你每次在 phpMyAdmin 里调整的主题、SQL窗口大小,甚至导航栏的折叠状态,这些个人偏好都去哪儿了?答案既不在浏览器的 Cookie 里,也不在服务器的临时文件中。实际上,只要启用了它的“高级功能”,这些设置默认就会被记录在 MySQL 数据库里一个名为 pma__userconfig 的表中。关键在于,这个表必须由当前 phpMyAdmin 实例所连接的数据库提供。正因如此,当你的操作环境切换到另一台服务器时,这些偏好设置自然就“跟不过去”了。
必须启用 pma__userconfig 并统一数据库后端
那么,想让多台服务器上的 phpMyAdmin 共享同一套用户偏好,该怎么办?如果每台服务器背后都是独立的 MySQL 实例,各自维护一份 pma__userconfig 表,同步就永远无法实现。可行的路径其实很明确:让所有的 phpMyAdmin 实例都指向同一个中央数据库。这个库甚至可以是一个专门用来存放 phpMyAdmin 元数据的轻量级实例。要实现这一点,下面几个配置缺一不可:
- 确保所有实例的
$cfg['Servers'][$i]['controluser']和controlpass都指向这个中心库的同一个管理账号。 - 将每个实例的
$cfg['Servers'][$i]['pmadb']参数统一设置为同一个数据库名,比如默认的phpmyadmin。 - 在这个中心库里,只需执行一次
create_tables.sql脚本,创建好包括pma__userconfig在内的所有必要表。 - 特别注意,不要在
config.inc.php里使用$cfg['Sa veDir']或$cfg['TempDir']这类配置去覆盖默认的用户配置存储路径。
用户表集中存储 ≠ 所有设置都自动同步
即便成功共享了 pma__userconfig 表,也别高兴得太早。有几个常见的“坑”会导致你以为同步了,实则没有:
- 登录状态本身(基于 Cookie 或 HTTP Auth)是浏览器层面的,与服务器无关。
- 浏览器本地存储(LocalStorage)里的一些临时状态,比如还没提交的 SQL 查询历史草稿,不会进入中心数据库。
- 如果使用了
$cfg['Servers'][$i]['auth_type'] = 'config'这种硬编码登录方式,用户偏好根本不会被写入pma__userconfig表。 - 更深一层,如果某台服务器的 PHP 会话(session)仍保存在本地磁盘,那么登录状态依然是隔离的。要实现真正的单点登录,还得将会话存储也改为 Redis 或数据库等共享方案。
常见错误:以为改 config.inc.php 就能同步偏好
一个典型的误解是:把 config.inc.php 配置文件复制到所有服务器,偏好自然就同步了。结果发现,每台服务器上的设置还是各记各的账。问题出在哪儿?
config.inc.php管的是全局行为开关(比如是否启用高级功能、默认排序规则),它不负责存储用户个人的偏好选项。- 如果错误地将
$cfg['UserprefsDisallow']设为true,会导致偏好功能被完全禁用,连本地都无法保存。 - 误用
$cfg['Servers'][$i]['user']进行硬编码登录,会导致 phpMyAdmin 跳过对pma__userconfig表的读写流程。 - 还有一个隐蔽的“静默失败”:连接中心库的 MySQL 账号如果没有被授予对
phpmyadmin库的SELECT, INSERT, UPDATE权限,数据写入会失败,但界面上往往没有任何错误提示。
所以,真正能让多服务器偏好同步起效的组合拳是:中心库 + 正确的 controluser 配置 + 启用 pma__userconfig 功能 + 用户使用 Cookie 或 HTTP 认证登录(杜绝 config 模式)。少一样,效果都可能大打折扣。
立即学习“PHP免费学习笔记(深入)”;
