PHP:mysqli_connect vs mysqli:使用mysqli_ping检查打开的连接

时间:2016-05-26 16:10:04

标签: php mysqli database-connection

我有一些函数采用可选的$connection参数(默认为null)。如果它未设置或为空,我想重新打开或生成新的数据库连接,所以我执行此检查:

if(empty($connection) || mysqli_connect_errno() || !mysqli_ping($connection)) $connection = connect();

我的connect()功能如下,但基本上它返回mysqli_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;
}

这些导致了一堆警告:

Warning: mysqli_ping(): Couldn't fetch mysqli in /var/www/html/project/functions.php on line 123

我意识到传递mysqli_ping一个mysqli_connect $link是一个错误而不是mysqli个对象,但是我怎么可能检查我的{{} {1}}对象已设置并打开?如果不是,请打开它?

1 个答案:

答案 0 :(得分:0)

好的,所以这是我的答案:

mysqli_ping文档说:

  

检查与服务器的连接是否正常。如果它已经关闭... 长时间处于空闲状态的客户端可以使用此功能,以检查服务器是否已关闭连接并在必要时重新连接

问题是你假设mysqli_ping在手动关闭连接时会起作用,但是这个功能不起作用。

如果手动关闭连接,该对象仍然存在,但指向此功能/方法无法ping或重新打开的已关闭连接。就像关闭它之后使用$connection->ping()一样。

当你说:

  

我意识到通过mysqli_ping mysqli_connect $链接是一个mysqli对象的错误......

这不正确。连接对象(由mysqli_connect返回或使用mysqli构造函数创建)是函数接受的唯一类型或参数。

您可以尝试:

  • 在脚本结束之前不关闭连接

或者

  • 每次使用unset($connection)关闭连接变量后取消设置。

我希望它有所帮助。