帝国CMS两个站点共享一个数据库,是通过配置不同数据表前缀实现的,避免表名冲突,需在后台“数据库配置”中为每个站点设置独立表前缀(如“site1_”“site2_”),并确保数据库用户有足够权限访问所有相关表,此方式可实现数据共享(如共用会员、内容模型),但需注意数据隔离,避免误操作导致跨站点影响,适用于多子站架构或内容复用场景,操作时需谨慎修改表前缀,并定期备份数据库以防数据异常。
帝国CMS实现双站点共享数据库的配置方案与实战指南
在多站点架构建设中,基于同一套CMS实现数据统一管理是降低运维成本、提升资源利用率的有效策略,帝国CMS凭借其灵活的数据库配置机制,支持通过表前缀隔离实现多站点数据共享,本文将系统解析双站点共享数据库的配置流程、核心逻辑及注意事项,为开发者提供可落地的技术方案。
需求分析与架构设计
在配置前需明确数据共享模式,主要分为两类场景:
- 完全隔离模式:两站点独立使用各自数据表(如内容表、栏目表),仅共享基础设施表(如系统配置表)
- 部分共享模式:核心业务表(如用户表、会员表)跨站点共用,内容表独立管理
本文以部分共享模式为例展开,实现用户统一登录与部分内容互通,同时保持内容数据隔离。
数据库结构设计与表前缀规则
共享数据库的核心在于通过表前缀机制实现数据隔离,避免表名冲突,建议采用分级前缀策略:
数据库初始化
CREATE DATABASE `empire_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON `empire_db`.* TO 'empire_user'@'localhost' IDENTIFIED BY 'StrongPassw0rd!'; FLUSH PRIVILEGES;
表前缀规范设计
| 表类型 | 站点A(主站) | 站点B(子站) | 共享表 |
|---|---|---|---|
| 内容表 | cms_a_news | cms_b_news | |
| 栏目表 | cms_a_class | cms_b_class | |
| 用户表 | cms_user | ||
| 会员表 | cms_member |
数据安装流程
- 安装站点A:默认生成前缀为
cms_a_的独立表及共享表 - 安装站点B:复用
empire_db,在安装向导中手动修改config.php的表前缀为cms_b_ - 跳过共享表创建:安装站点B时需在数据库配置步骤跳过用户表/会员表的创建
站点配置文件核心修改
通过修改e/config.php实现数据库连接与表前缀隔离,关键配置如下:
站点A配置示例
<?php $empire['db']['server'] = 'localhost'; $empire['db']['username'] = 'empire_user'; $empire['db']['password'] = 'StrongPassw0rd!'; $empire['db']['dbname'] = 'empire_db'; $empire['db']['tablepre'] = 'cms_a_'; // 独立表前缀 $empire['db']['connect'] = 0; // 长连接 $empire['db']['charset'] = 'utf8mb4';// 共享表配置(关键!) $empire['public']['tablepre'] = 'cms_'; // 公共表前缀 ?>
站点B配置示例
<?php // 数据库连接信息与站点A完全一致 $empire['db']['server'] = 'localhost'; $empire['db']['username'] = 'empire_user'; $empire['db']['password'] = 'StrongPassw0rd!'; $empire['db']['dbname'] = 'empire_db';// 仅修改独立表前缀 $empire['db']['tablepre'] = 'cmsb'; // 独立表前缀 $empire['db']['connect'] = 0; $empire['db']['charset'] = 'utf8mb4';
// 保持共享表配置一致 $empire['public']['tablepre'] = 'cms_'; ?>
数据共享与隔离实现机制
自动隔离原理
帝国CMS通过$empire['db']['tablepre']自动拼接表名,实现数据隔离:
- 站点A查询内容时自动使用
SELECT * FROM cms_a_news - 站点B查询内容时自动使用
SELECT * FROM cms_b_news - 用户认证时自动查询共享表
cms_user
调用方案
互通时,可通过自定义SQL实现:
// 站点A调用站点B的热门新闻
$sql = $empire->query("SELECT * FROM cms_b_news WHERE newstime > UNIX_TIMESTAMP()-86400 ORDER by onclick DESC LIMIT 10");
while($r=$empire->fetch($sql)){
// 处理跨站点数据输出
}
关键注意事项与最佳实践
安全加固措施
- 为不同站点配置独立的数据库用户,限制权限范围
- 共享表需添加跨站点访问控制字段(如
site_id) - 定期备份共享表数据,防止单点故障