Q1:环境检测卡在“MySQL扩展检测”报红叉
现象:安装帝国CMS时,环境检测页面的“MySQL扩展”项显示红色叉号,无法继续安装。
帝国CMS运维实录,数据表主主复制与十二个高频故障的终极排障手册
原因:PHP未正确启用mysqli或mysql扩展,常见于PHP 7.4+环境下未安装mysqlnd驱动,或php.ini中extension=mysqli被注释。
解决步骤:
- 登录服务器终端,执行
php -m | grep mysql查看是否输出mysqli。 - 若为空,修改php.ini文件:
find / -name php.ini -exec grep -l "mysqli" {} \;找到对应路径后,取消注释
extension=mysqli(或extension=php_mysqli.dll)。 - 重启PHP服务:
systemctl restart php-fpm # CentOS service php7.4-fpm restart # Ubuntu
- 检查
/tmp目录权限,执行chmod 777 /tmp后重试。
Q2:后台登录页无限跳转回登录界面
现象:输入正确账号密码后,页面刷新仍显示登录框,地址栏带?return参数。
原因:Session会话目录无写入权限,或phome表记录被写死所致,主主复制场景下,两个数据库节点的phome表记录未能同步。
解决步骤:
- 检查Session保存路径:
session.save_path = "/tmp/php_sessions"
确保该目录存在且可写,
chmod 755 /tmp/php_sessions并chown www:www。 - 登录任一数据库节点,清空
phome表:DELETE FROM phome WHERE 1;
清空后,主主复制会自动同步给另一节点,此时重新登录即可生成新记录。
Q3:数据库连接失败,报“Lost connection to MySQL server at 'reading initial communication packet'”
现象:前端页面或后台报2006错误,连接字符串地址、端口、密码无误,但偶尔能连上、偶尔连不上。
原因:主主复制场景下,网络抖动或MariaDB/MySQL的wait_timeout参数过短,导致长连接被断开,当数据库节点切换查询时,连接池未更新。
解决步骤:
- 修改数据库配置文件
/etc/my.cnf:[mysqld] wait_timeout = 31536000 interactive_timeout = 31536000 max_connections = 500
- 在帝国CMS的
e/config/config.php中,强制使用短连接:define('USE_PCONNECT', false); // 禁用持久连接 - 主主复制时,在
config.php中设定'db_newid' => 0(强制只写主节点),并将两个MySQL节点的server_id设为不同值。
Q4:前台页面显示空白,浏览器无任何输出
现象:帝国CMS首页或栏目页彻底空白,右键查看源代码为空,数据库验证连接正常,后台能正常访问。
原因:最常见是PHP内存不足,或某栏目模板文件因SQL查询导致死循环,主主复制时,若phome_enewsuser等用户表数据未同步,导致会员模型查询崩溃。
解决步骤:
- 打开
e/config/config.php,设置:ini_set('display_errors', 1); error_reporting(E_ALL);刷新页面,查看具体报错,若为“Allowed memory size exhausted”,编辑
php.ini:memory_limit = 256M max_execution_time = 120
- 若无报错,检查
e/data/dbcache/目录是否存在,且权限为755,清空该目录下所有.php缓存文件。 - 在数据库中执行表修复:
CHECK TABLE phome_ecms_news, phome_enewstemp, phome_enewstags EXTENDED;
Q5:数据表损坏,报“Table 'phome_ecms_news' is marked as crashed”
现象:后台或前台频繁弹出“Table xxx is marked as crashed and should be repaired”错误。
原因:非正常关闭服务,或主主复制时某节点写入数据后未完成复制就宕机,导致表索引损坏。
解决步骤:
- 分别登录两个MySQL节点:
REPAIR TABLE phome_ecms_news; REPAIR TABLE phome_ecms_news_data_1;
- 若修复失败,使用命令行工具:
mysqlcheck -u root -p --repair --databases phome_*** # phome_***替换为实际库名
- 若仍不行,导出该表为SQL文件:
mysqldump -u root -p phome_db phome_ecms_news > /tmp/news_bak.sql
然后删除表并重新导入,若主主复制已中断,需先
STOP SLAVE,修复后SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1再START SLAVE。
Q6:灵动标签[e:loop]报“Invalid argument supplied for foreach()”
现象:使用[e:loop]循环调用模型数据时,页面显示500错误,或直接报“Invalid argument supplied for foreach()”。
原因:标签内SQL语句返回空结果集,或主主复制时enewsplayer、enewsfava等辅助表与主表数据不同步,导致JOIN查询失败。
解决步骤:
- 检查标签写法,
[e:loop={'select * from phome_ecms_news where checked=1 order by newstime desc',10,24,0}]确保
phome_ecms_news表存在,且模型ID=24无误。 - 在数据库工具中执行该SQL,验证返回结果,若提示“Table doesn't exist”,说明某节点未同步该表,手动在从节点建表:
CREATE TABLE phome_ecms_news LIKE phome_ecms_news;
- 在
e/class/connect.php中找到ReturnSql()函数,增加错误捕获:if (!$this->sql) { echo 'SQL Error: '.$this->sql; exit; }
Q7:模板导入失败,报“模版文件格式不正确”
现象:导入.php格式的模板文件时,系统提示“模版文件格式不正确”,无法解析。
原因:主主复制下,phome_enewstemp表的主键ID冲突,或文件扩展名被系统误判,帝国CMS要求模板文件严格以.php开头必须包含<?php。
解决步骤:
- 检查模板文件第一行是否是
<?php开头,末尾是否有?>(最好无?>避免空白行),将文件编码统一改为UTF-8无BOM。 - 登录数据库,查看
phome_enewstemp表的主键值:SELECT MAX(tempid) FROM phome_enewstemp;
若结果与另一节点MAX值重复,需手动调整,在导入前,执行:
DELETE FROM phome_enewstemp WHERE tempid = 0;
- 将文件放到服务器
/e/admin/目录下,改用“在线更新”方式导入,登录后台→模板→导入→选择文件→提交,若提示“文件大小超限”,修改php.ini:upload_max_filesize = 50M post_max_size = 50M
Q8:后台“数据库备份”功能无响应
现象:点击“备份数据”按钮,页面空白或只输出“正在备份...”但无后续,备份目录无文件生成。
原因:备份目录权限不足,或PHP执行超时时间不够,主主复制场景下,若备份SQL文件包含SET @@GLOBAL.GTID_PURGED语句,会引起从节点报错。
解决步骤:
- 检查
e/data/backup/目录权限:chmod -R 777 e/data/backup/
- 修改php.ini:
max_execution_time = 600 memory_limit = 512M
- 手动执行备份命令:
mysqldump -u root -p phome_db --skip-gtid --single-transaction > backup.sql
确保跳过了GTID信息。
- 使用帝国CMS自带的“分卷备份”功能,将备份大小设为2MB,避免单次执行时间过长。
Q9:后台登录显示“验证码错误”但实际输入无误
现象:验证码图片显示正确,但输入后始终提示“验证码错误”,刷新页面后仍报错。
原因:Session冲突或验证码存储表phome_enewscode数据不同步,主主复制时,A节点生成的验证码存于A库,但请求被路由到B节点,B库中无对应记录。
解决步骤:
- 在
e/config/config.php中强制固定Session名称:session_name('ecms_login'); - 检查两个数据库节点的
phome_enewscode表结构是否一致,并设置为主表ENGINE=MEMORY,提升性能。 - 登录任意节点数据库,清空该表:
TRUNCATE TABLE phome_enewscode;
- 若仍不行,临时关闭验证码功能:在
e/enews/index.php中找到LoadClass('checkcode'),注释掉验证码判断代码。
Q10:手机端模板显示“模版不存在”
现象:使用手机设备访问时,始终显示“该页面模版不存在”,而PC端访问正常。
原因:主主复制未同步phome_enewspage表中的手机模板绑定记录,帝国CMS手机端模板依赖pagename字段的-wap后缀识别。
解决步骤:
- 登录后台→模板→页面模板管理→找到对应PC模板ID。
- 手动复制一份PC模板记录,修改
pagename字段为原模板名-wap,template字段修改为手机模板文件名。 - 在
e/config/config.php中确保:define('REWRITE', 0); define('MULTIEND', 1); // 启用多终端 - 检查
e/class/template.php中GetTplText()函数,确认它搜索了pagename包含“wap”的记录。
后记:帝国CMS的主主复制本质是双向同步,但运维核心在于保持两节点表结构的完全一致与GTID对齐,遇到问题先查SHOW SLAVE STATUS的Last_IO_Errno和Last_SQL_Errno,再配合以上十二步逐一排查,每次修改配置文件后,务必在测试节点先行验证,再同步到生产节点。



发表评论