27

我将使用mysqli_close($connection)关闭$connection. 但在关闭之前,我需要确保相关连接已打开。

我试过了

if($connection)
{
  mysqli_close($connection);
}

但它不起作用。任何解决方案?

4

8 回答 8

41

这是来自PHP.net

面向对象风格


<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

/* check if server is alive */
if ($mysqli->ping()) {
    printf ("Our connection is ok!\n");
} else {
    printf ("Error: %s\n", $mysqli->error);
}

/* close connection */
$mysqli->close();
?>

程序风格


<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

/* check if server is alive */
if (mysqli_ping($link)) {
    printf ("Our connection is ok!\n");
} else {
    printf ("Error: %s\n", mysqli_error($link));
}

/* close connection */
mysqli_close($link);
?>
于 2013-10-04T18:35:35.693 回答
9

虽然有些人建议检查$connection->ping(),$connection->stat()或,但如果连接之前关闭mysqli_thread_id($connection),这三个将抛出: ' '。Couldn't fetch mysqli

对我有用的解决方案是:

if(is_resource($connection) && get_resource_type($connection)==='mysql link'){
    $connection->close(); //Object oriented style
    //mysqli_close($connection); //Procedural style 
}

PS:仅在受控上下文中检查它是否是资源就足够了。

于 2017-01-16T06:00:51.713 回答
4

只是不要关闭它。那将是有史以来最好的解决方案。

99.9% 的时间完全可以不理会连接,PHP 会为您关闭它。

仅当您的脚本必须执行一些不涉及数据库交互的繁重耗时任务时,您可能需要在开始此操作之前关闭连接。但在这种情况下,您将故意打开连接,因为代码周围不会散布随机闭包,因此无需检查它是否已经关闭。因此,在这种特殊但极为罕见的情况下,只需关闭它即可。

所有其他时间都别管它。

于 2013-05-01T13:55:29.867 回答
4

如果您打开一个连接,它将保持打开状态,直到它被显式关闭或脚本结束(除非持久连接处于打开状态)。使用您拥有的代码应该可以工作。

一种选择是扩展mysqli类并拥有一个名为的状态属性$connected

class CustomMysqli extends mysqli
{
    protected bool $connected;

    public function __construct($host, $username, $password, $database)
    {
        parent::__construct($host, $username, $password, $database);
        $this->connected = ($this->connect_errno === 0);
    }

    public function close(): void
    {
        if ($this->connected) {
            parent::close();
            $this->connected = false;
        }
    }

    public function isConnected(): bool
    {
        return $this->connected;
    }
}

检查$connected属性有点矫枉过正,但可以确保连接仍然打开。

于 2013-05-01T13:58:38.693 回答
4

您可以检查是否设置了 mysqli 服务器信息。

$connection = new MySQLi('localhost', 'user', 'pass', 'db');
if(!isset($connection->server_info)){
    echo 'sql connection is closed';
}else{
    $connection -> close();
}
于 2021-02-28T18:11:00.727 回答
-1

接受的答案对我不起作用,因为couldn't fetch mysqli如果连接上的调用函数已经关闭,则会引发错误。我最终mysqli在关闭连接之前和之后检查了对象:

// Before calling $connection->close()

object(mysqli)#92 (18) {
  ["affected_rows"]=>
  int(0)
  ["client_info"]=>
  string(14) "mysqlnd 7.4.23"
  ["client_version"]=>
  int(11111)
  ["connect_errno"]=>
  int(0)
  ["connect_error"]=>
  NULL
  ["errno"]=>
  int(0)
  ["error"]=>
  string(0) ""
  ["error_list"]=>
  array(0) {
  }
  ["field_count"]=>
  int(0)
  ["host_info"]=>
  string(73) "host.rds.com via TCP/IP"
  ["info"]=>
  NULL
  ["insert_id"]=>
  int(0)
  ["server_info"]=>
  string(10) "1.1.1-log"
  ["server_version"]=>
  int(11111)
  ["sqlstate"]=>
  string(5) "00000"
  ["protocol_version"]=>
  int(10)
  ["thread_id"]=>
  int(1234567)
  ["warning_count"]=>
  int(0)
}

// After calling $connection->close()

object(mysqli)#92 (3) {
  ["client_version"]=>
  int(11111)
  ["connect_errno"]=>
  int(0)
  ["connect_error"]=>
  NULL
}

基于该信息,我刚刚编写了以下简单函数:

private function isClosed() : bool
{
    return !is_int($this->connection->thread_id);
}
于 2021-10-16T03:21:21.453 回答
-2

检查连接错误。mysqli_connect() 总是返回一个 MySQLi 对象。

用这个:

$mysqli_connection = new MySQLi('localhost', 'user', 'pass', 'db');
if ($mysqli_connection->connect_error) {
   echo "Not connected, error: " . $mysqli_connection->connect_error;
}
else
{
   echo "Connected.";
}
于 2014-11-16T08:18:36.600 回答
-4

尝试这个:

function close_connection(){
    $thread = $mysqli->thread_id;
    $mysqli->close();
    $mysqli->kill($thread);

}

这将关闭您使用面向对象样式打开的连接,如下所示:

$mysqli = new mysqli($db_server, $db_username, $db_password, $db_name);

这是基本思想,但如果您使用的是过程风格,我相信您将能够根据需要自定义代码。

于 2014-01-05T06:41:31.753 回答