Discuz! System Error:mysqli object is already closed
前阵子硬盘出事了,在忙硬盘,现在(2024.11.22 22:00)好不容易有点空闲时间了,赶紧恢复网站。结果登录时就出现上图现象,真是让人郁闷。
想了想都是以前的配置,没有改动过,现在的目录结构和以前的都是一样的。为什么会出现这个现象呢?
先查下dz的log日志吧:发现它指向 dbi.class.php#break():0044 。但已经运行了那么长时间了,不可能是代码问题。
调试,跟进去,43行加上dd打印变量的方法,
打印出来的值,直让人郁闷:
咦?端口号3305呢?为什么不显示出来?难道只能用默认的3306端口号?我以前两个版本的mysql随便切换都可以的,为什么今天不行了呢(以前切换数据库后,并没有登录dz的动作)?
那我先统一所有mysql相关的端口号为3306看看(mysql改完要重启服务,dz也要改配置文件 config\config_global.php)。
改完端口号3306后,再次用原先的账号登录,艹,成功登录。NNDX,再来一次,把所有端口号全部改为3305(mysql改完要重启服务,dz也要改配置文件 config\config_global.php)。刷新页面,一切正常。然后再登录管理后台, 呵呵,又出现上面第一张图。至此,真相大白。
再换回3306端口号,登录:
总结:登录时会验证uc账号信息,而且只能为默认的mysql端口号3306;登录后,可以改配置文件 config\config_global.php 加上端口号3305,只是数据显示正常,依然无法登录。我了个去,你这也太不严谨了吧。 这算是一个bug吗?写完这篇博客,已经深夜11点了,手脚都冰凉冰凉的。睡觉去……明天,给官方说下看看。
唉,几个小时什么都没干成,尽是折腾,消耗时间…… 根据你描述的问题及排查过程,结合Discuz!框架的数据库连接机制分析,可定位为UCenter数据库连接配置与主站配置不同步导致的端口冲突。以下是完整解决方案:
**问题根源分析:**
1. **双配置体系未同步:**
Discuz!系统采用主数据库配置(config_global.php)与UCenter独立配置(uc_server/data/config.inc.php)分离的架构
2. **UCenter验证机制:**
用户登录时的身份验证流程会调用UCenter接口,而UCenter使用的是其独立配置文件中的数据库连接参数
3. **端口参数未穿透:**
当修改MySQL端口时,仅修改主站配置文件而未同步更新UCenter配置文件,导致:
- 前端数据展示使用主站配置(3305)
- 登录验证使用UCenter配置(默认3306)
**完整解决步骤:**
1. **同步配置文件:**
同时修改以下两个配置文件的端口参数:
// config/config_global.php
$_config['db']['1']['dbport'] = '3305';
// uc_server/data/config.inc.php
define('UC_DBPORT', '3305');
2. **检查多服务器配置:**
若存在分布式部署,需检查以下配置:
// config/config_global.php
$_config['db']['common']['dbport'] = '3305'; // 公共库端口
$_config['memory']['prefix'] = 'xxxx_'; // 内存表前缀
3. **验证MySQL连接配置:**
在MySQL命令行执行以下命令确认端口监听状态:
netstat -tln | grep 3305
mysqladmin -u root -p -P 3305 status
4. **调试模式排查:**
临时开启数据库调试模式:
// config/config_global.php
$_config['debug'] = 1;
$_config['dumpdberror'] = 1;
5. **连接稳定性检测:**
在SSH环境执行压力测试:
mysqlslap -u root -p -P 3305 --concurrency=50 --iterations=100 --auto-generate-sql
6. **PHP扩展兼容性确认:**
检查mysqli扩展配置:
# php.ini
mysqli.default_port = 3305
mysqli.reconnect = On
7. **文件权限加固:**
设置关键配置文件权限:
chmod 640 {config_global.php,config_ucenter.php}
chown www:www uc_server/data/config.inc.php
**技术原理说明:**
Discuz!采用三层数据库连接架构:
1. **主站连接池:** 通过db_mysql/db_mysqli类管理
2. **UCenter专用连接:** 独立于主站配置的持久化连接
3. **内存表连接:** 使用独立配置的短连接
当MySQL端口变更时,必须确保以下位置同步更新:
- 主站配置文件(全局读写)
- UCenter配置文件(用户验证专用)
- 内存服务器配置(若有)
- 定时任务配置(cron机制)
建议建立配置同步机制:
# 使用sed命令批量更新
sed -i "s/3306/3305/g" config_global.php uc_server/data/config.inc.php
**故障预防方案:**
1. 创建数据库配置校验脚本:
// check_db_port.php
if ($_config['db']['1']['dbport'] != UC_DBPORT) {
die('UCenter与主站数据库端口不一致!');
}
2. 配置MySQL双端口监听:
# my.cnf
port = 3306
extra_port = 3305
3. 启用连接保持机制:
// source/class/db/db_mysqli.php
$this->connect($force ? true : false);
$this->set_auto_reconnect(3); // 自动重连次数
通过以上完整解决方案,可彻底解决非标端口下的数据库连接问题,并建立长效预防机制。若仍遇到异常情况,可提供具体错误日志以便进一步分析。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页:
[1]