哥斯拉 发表于 2023-2-13 08:30:06

UC与社区程序不在同一服务器上,报错mysqli object is already closed

UC与社区程序不在同一服务器上,报错如下。原来DZ3.4在用的时候是正常的。。
两边看通讯也都正常。

目前是临时在社区服务器上搭了一个UC,把数据库导过来用。因为现在玩社区的人少,新人注册很少,所以能先坚持一段时间。

不知道这个可能是什么原因?


Discuz! System ErrorTime: 2023-02-12 22:43:41 IP: 120.244.24.131 BackTraceID: 1b8b1e9ef66f7ff2ed38b64f3a7a492a
mysqli object is already closed
PHP Debug
No.FileLineCode1admin.php30discuz_admincp->init()2source/class/discuz/discuz_admincp.php61discuz_admincp->check_cpaccess()3source/class/discuz/discuz_admincp.php126discuz_admincp->check_admin_login()4source/class/discuz/discuz_admincp.php159uc_user_login()5uc_client/client.php402uc_api_mysql()6uc_client/client.php129usercontrol->__construct()7uc_client/control/user.php25usercontrol->usercontrol()8uc_client/control/user.php29base->__construct()9uc_client/model/base.php38base->base()10uc_client/model/base.php46base->init_db()11uc_client/model/base.php87ucclient_db->connect()12uc_client/lib/dbi.class.php44mysqli->options()13uc_client/lib/dbi.class.php44break()


我知道答案 回答被采纳将会获得1 贡献 已有0人回答

Discuz智能体 发表于 2025-3-16 23:42:45

根据你提供的错误信息,`mysqli object is already closed` 这个错误通常与数据库连接有关。具体来说,这个错误表示在尝试使用一个已经关闭的 MySQLi 连接对象时发生了错误。

### 可能的原因和解决方案:

1. **数据库连接超时或断开**:
   - 由于 UC(用户中心)和社区程序不在同一服务器上,网络延迟或连接不稳定可能导致数据库连接超时或断开。
   - **解决方案**:检查 UC 和社区程序之间的网络连接是否稳定。可以尝试增加数据库连接的超时时间,或者在代码中增加重试机制。

2. **数据库连接未正确关闭**:
   - 在某些情况下,数据库连接可能被意外关闭,导致后续操作无法使用该连接。
   - **解决方案**:确保在每次数据库操作后正确关闭连接,或者在需要时重新建立连接。

3. **UC 和社区程序的数据库配置不一致**:
   - 如果 UC 和社区程序的数据库配置不一致,可能会导致连接问题。
   - **解决方案**:检查 UC 和社区程序的配置文件(通常是 `config/config_ucenter.php` 和 `config/config_global.php`),确保数据库连接信息(如主机名、用户名、密码等)正确无误。

4. **数据库服务器配置问题**:
   - 数据库服务器可能配置了连接限制或超时设置,导致连接被关闭。
   - **解决方案**:检查数据库服务器的配置,确保连接数和超时设置合理。

5. **PHP 版本或 MySQLi 扩展问题**:
   - 如果 PHP 版本或 MySQLi 扩展存在问题,可能会导致连接异常。
   - **解决方案**:确保 PHP 版本和 MySQLi 扩展是最新的,并且与 Discuz! 兼容。

### 具体操作步骤:

1. **检查网络连接**:
   - 使用 `ping` 或 `traceroute` 命令检查 UC 服务器和社区服务器之间的网络连接是否稳定。

2. **检查数据库连接配置**:
   - 打开 `config/config_ucenter.php` 和 `config/config_global.php`,确保数据库连接信息正确。

3. **增加数据库连接超时时间**:
   - 在 `config/config_global.php` 中增加以下配置:
   $_config['db']['connecttimeout'] = 10; // 增加连接超时时间

4. **检查数据库服务器配置**:
   - 登录数据库服务器,检查 `my.cnf` 或 `my.ini` 配置文件,确保 `max_connections` 和 `wait_timeout` 设置合理。

5. **更新 PHP 和 MySQLi 扩展**:
   - 确保 PHP 版本和 MySQLi 扩展是最新的,并且与 Discuz! 兼容。

### 代码示例:

如果你需要在代码中增加重试机制,可以参考以下示例:

function connectWithRetry($host, $user, $password, $database, $retries = 3) {
    $conn = null;
    for ($i = 0; $i < $retries; $i++) {
      $conn = new mysqli($host, $user, $password, $database);
      if ($conn->connect_error) {
            sleep(1); // 等待1秒后重试
            continue;
      }
      break;
    }
    return $conn;
}

$conn = connectWithRetry('localhost', 'user', 'password', 'database');
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

### 总结:

通过以上步骤,你应该能够解决 `mysqli object is already closed` 的问题。如果问题仍然存在,建议进一步检查日志文件,或者联系专业的开发者进行深入排查。

如果你有其他问题或需要进一步的帮助,请随时联系我。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

AI智能体 发表于 2025-3-21 02:27:31

根据你提供的错误信息 `mysqli object is already closed`,这个问题通常与数据库连接有关。由于UC(用户中心)和社区程序不在同一服务器上,可能是由于网络延迟、数据库连接超时或数据库连接配置不当导致的。

### 可能的原因及解决方案:

1. **数据库连接超时**:
   - 由于UC和社区程序不在同一服务器上,网络延迟可能导致数据库连接超时。你可以尝试增加数据库连接的超时时间。
   - 在 `config/config_ucenter.php` 文件中,找到 `UC_DBTIMEOUT` 配置项,适当增加其值。例如:
   define('UC_DBTIMEOUT', 30); // 将超时时间设置为30秒

2. **数据库连接配置错误**:
   - 确保 `config/config_ucenter.php` 文件中的数据库连接配置正确无误。特别是 `UC_DBHOST`、`UC_DBUSER`、`UC_DBPW`、`UC_DBNAME` 等配置项。
   - 确保UC和社区程序之间的数据库连接信息一致。

3. **数据库连接未正确关闭**:
   - 在某些情况下,数据库连接可能被意外关闭。你可以尝试在 `uc_client/model/base.php` 文件中,检查 `init_db` 方法,确保数据库连接在每次请求时都能正确初始化。
   - 你可以在 `init_db` 方法中添加一些调试信息,检查数据库连接是否正常。

4. **数据库服务器配置**:
   - 检查数据库服务器的配置,确保允许远程连接。有些数据库服务器默认只允许本地连接,需要手动开启远程连接权限。
   - 检查数据库服务器的防火墙设置,确保没有阻止来自社区程序服务器的连接。

5. **数据库连接池问题**:
   - 如果数据库连接池中的连接被意外关闭,可能会导致 `mysqli object is already closed` 错误。你可以尝试在 `uc_client/lib/dbi.class.php` 文件中,检查数据库连接的关闭逻辑,确保连接在不需要时正确关闭。

6. **PHP版本兼容性**:
   - 如果你最近升级了PHP版本,可能会导致某些数据库连接相关的函数行为发生变化。确保你的PHP版本与Discuz!版本兼容。

### 调试建议:
- 你可以在 `uc_client/model/base.php` 文件的 `init_db` 方法中添加调试信息,检查数据库连接是否正常:
function init_db() {
      global $uc_client_db;
      if(!is_object($uc_client_db)) {
          $uc_client_db = new ucclient_db();
          $uc_client_db->connect(UC_DBHOST, UC_DBUSER, UC_DBPW, UC_DBNAME, UC_DBCHARSET, UC_DBCONNECT, UC_DBTABLEPRE);
          if($uc_client_db->connect_errno) {
            die('Database connection error: ' . $uc_client_db->connect_error);
          }
      }
}

- 你还可以在 `uc_client/lib/dbi.class.php` 文件中,检查 `mysqli->options()` 方法的调用,确保数据库连接选项设置正确。

### 总结:
这个问题通常与数据库连接配置或网络延迟有关。你可以通过增加数据库连接超时时间、检查数据库连接配置、确保数据库服务器允许远程连接等方式来解决这个问题。如果问题依然存在,建议进一步调试数据库连接逻辑,确保连接在每次请求时都能正确初始化。

希望这些建议能帮助你解决问题!如果还有其他问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: UC与社区程序不在同一服务器上,报错mysqli object is already closed