PHP:mysqli\u connect vs mysqli:mysqli\u ping检查打开的连接
我有一些函数采用可选的PHP:mysqli\u connect vs mysqli:mysqli\u ping检查打开的连接,php,mysqli,database-connection,Php,Mysqli,Database Connection,我有一些函数采用可选的$connection参数(默认为null)。如果未设置或为空,我希望重新打开或生成一个新的数据库连接,因此我执行以下检查: if(空($connection)| mysqli|u connect|errno()| | |!mysqli|u ping($connection))$connection=connect() 我的connect()函数如下,但基本上它返回一个mysqli\u connect资源: function connect() { $hostname
$connection
参数(默认为null)。如果未设置或为空,我希望重新打开或生成一个新的数据库连接,因此我执行以下检查:
if(空($connection)| mysqli|u connect|errno()| | |!mysqli|u ping($connection))$connection=connect()代码>
我的connect()
函数如下,但基本上它返回一个mysqli\u connect
资源:
function connect() {
$hostname = getDBHostname();
$dbusername = getDBUsername();
$dbpassword = getDBPassword();
$dbname = getDBDatabase();
$connection = mysqli_connect($hostname, $dbusername, $dbpassword);
if($connection == false) {
die('Database Connection Initialization Failed');
}
else if($connection->connect_error) {
die('Fatal DB Connect Error ('.$connection->connect_errno.') '.$connection->connect_error);
}
$test = mysqli_select_db($connection, $dbname);
return $connection;
}
这导致了一系列警告:
警告:mysqli_ping():无法在第123行的/var/www/html/project/functions.php中获取mysqli
我意识到传递mysqli\u ping
amysqli\u connect
$link
是对mysqli
对象的错误,但是我怎么可能检查我的mysqli\u connect
对象是否已设置并打开?如果未设置,请打开它?好的,下面是我的答案:
mysqli_ping文档中说:
检查与服务器的连接是否正常工作。如果它下降了。。。此功能可供长时间处于空闲状态的客户端使用,以检查服务器是否已关闭连接,并在必要时重新连接
问题是,您假设手动关闭连接时,mysqli\u ping
将正常工作,但该函数不是这样工作的
如果手动关闭连接,则对象仍然存在,但指向无法通过此函数/方法ping打开或重新打开的已关闭连接。就像在关闭连接后使用$connection->ping()
一样
当你说:
我意识到传递mysqli\u ping一个mysqli\u connect$链接是对mysqli对象的错误
这是不对的。连接对象(由mysqli\u connect
返回或使用mysqli构造函数创建)是函数接受的唯一类型或参数
您可以尝试:
- 在脚本结束之前不关闭连接
或
- 每次使用
unset($connection)
关闭连接变量后,都将其取消设置
我希望这能有所帮助。好吧,下面是我的答案:
mysqli_ping文档中说:
检查与服务器的连接是否正常工作。如果它下降了。。。此功能可供长时间处于空闲状态的客户端使用,以检查服务器是否已关闭连接,并在必要时重新连接
问题是,您假设手动关闭连接时,mysqli\u ping
将正常工作,但该函数不是这样工作的
如果手动关闭连接,则对象仍然存在,但指向无法通过此函数/方法ping打开或重新打开的已关闭连接。就像在关闭连接后使用$connection->ping()
一样
当你说:
我意识到传递mysqli\u ping一个mysqli\u connect$链接是对mysqli对象的错误
这是不对的。连接对象(由mysqli\u connect
返回或使用mysqli构造函数创建)是函数接受的唯一类型或参数
您可以尝试:
- 在脚本结束之前不关闭连接
或
- 每次使用
unset($connection)
关闭连接变量后,都将其取消设置
我希望它能有所帮助。尝试将$connection作为全局变量。让我问你一个问题:在脚本中的任何时候,在执行所有操作之前,你是否自己使用mysq_close()或$connection->close()关闭连接?全局可能是一种有效的解决方法,但它并不能严格回答这个问题。是的,我确实调用mysqli_close,有可能发生这种情况,然后再次尝试连接。这就是为什么我想在它关闭时重新打开它(或者完全生成一个新连接),这是mysqli_-ping应该做的,但是对于不同的对象类型(mysqli_-ping需要一个mysqli对象,但我正在使用mysqli_-connect对象)。尝试将$connection作为全局变量。让我问你一个问题:在脚本中的任何时候,在执行所有操作之前,您是否自己使用mysq_close()或$connection->close()关闭连接?Global可能是一种有效的解决方法,但它不能严格回答这个问题。是的,我确实调用mysqli_close,有可能发生这种情况,然后再次尝试连接。这就是为什么我想在它关闭时重新打开(或者产生一个新的连接),这是mysqli_-ping应该做的,但是对于不同的对象类型(mysqli_-ping需要一个mysqli对象,但我正在使用mysqli_-connect对象)。在任何给定的mysqli_-close($connection)
调用之后,我已经在执行unset($connection)
了,后续问题:您总是传递$connection参数,还是在某些函数中忽略它?后续操作:它是否总是显示警告,还是仅在传递或忽略时才显示警告?另外,我希望您不要在其范围外取消$connection对象的设置,就像在您正在使用的某个函数内一样。因为这样做只会取消本地$connection,而不会取消全局$connection,除非它是通过&
操作符的引用传递的。我仍在跟踪它,但它看起来似乎在传递时只显示警告,但即使这样也可能不总是--仍在查看。我不是通过引用来传递,但我的设计是,只有在一开始没有通过引用的情况下,它才会关闭。想法是:你给我发了一个连接?好的,我会用它,别管它。你没送我一个?我会得到我自己的,等我完成后把它毁掉。我希望你能把这个打倒。我仍然建议不要使用mysqli\u connect\u errno()
check,因为您的连接似乎很好