我将使用mysqli_close($connection)
关闭$connection
. 但在关闭之前,我需要确保相关连接已打开。
我试过了
if($connection)
{
mysqli_close($connection);
}
但它不起作用。任何解决方案?
这是来自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); ?>
虽然有些人建议检查$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:仅在受控上下文中检查它是否是资源就足够了。
只是不要关闭它。那将是有史以来最好的解决方案。
99.9% 的时间完全可以不理会连接,PHP 会为您关闭它。
仅当您的脚本必须执行一些不涉及数据库交互的繁重耗时任务时,您可能需要在开始此操作之前关闭连接。但在这种情况下,您将故意打开连接,因为代码周围不会散布随机闭包,因此无需检查它是否已经关闭。因此,在这种特殊但极为罕见的情况下,只需关闭它即可。
所有其他时间都别管它。
如果您打开一个连接,它将保持打开状态,直到它被显式关闭或脚本结束(除非持久连接处于打开状态)。使用您拥有的代码应该可以工作。
一种选择是扩展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
属性有点矫枉过正,但可以确保连接仍然打开。
您可以检查是否设置了 mysqli 服务器信息。
$connection = new MySQLi('localhost', 'user', 'pass', 'db');
if(!isset($connection->server_info)){
echo 'sql connection is closed';
}else{
$connection -> close();
}
接受的答案对我不起作用,因为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);
}
检查连接错误。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.";
}
尝试这个:
function close_connection(){
$thread = $mysqli->thread_id;
$mysqli->close();
$mysqli->kill($thread);
}
这将关闭您使用面向对象样式打开的连接,如下所示:
$mysqli = new mysqli($db_server, $db_username, $db_password, $db_name);
这是基本思想,但如果您使用的是过程风格,我相信您将能够根据需要自定义代码。