【问题标题】:How do I check if PHP is connected to a database already?如何检查 PHP 是否已经连接到数据库?
【发布时间】:2011-02-28 21:55:08
【问题描述】:

基本上在伪代码中我正在寻找类似的东西

if (connected_to_any_database()) {
    // do nothing
}
else {
    mysql_connect(...)
}

如何实现

connected_to_any_database()

【问题讨论】:

标签: php mysql


【解决方案1】:

你试过mysql_ping()吗?

更新:从 PHP 5.5 开始,请改用 mysqli_ping()

Ping 一个服务器连接,或在连接中断时尝试重新连接。

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

或者,第二种(不太可靠的)方法是:

$link = mysql_connect('localhost','username','password');
//(...)
if($link == false){
    //try to reconnect
}

【讨论】:

  • 更新:从 PHP 5.5 开始,使用mysqli_ping()
  • @AlvinK。如果我使用 mysql_ping() 表明我有连接。但是当我使用@mysqli_ping() 时,它显示我没有连接。它的含义是什么。我正在使用 xampp。显然我的 php 代码在其他计算机上工作,但不在我的计算机上
  • @PankajNimgade:似乎是库或配置问题,您是否尝试使用其他版本重新安装 xampp?甚至是 nginx + php5-fpm?使用打开--verbose 选项的php-CLI 运行脚本。
  • @AlvinK.,感谢您的回复,显然它现在正在工作,但我必须使用 oop 方法并且必须使用“mysqli”。谢谢
  • 最好的选择是使用 ping 功能。如果您使用 mysqli 库,mysqli_ping 只会分叉。如果您的应用程序正在使用已弃用的 mysql lib 版本,那么请至少使用 mysql_ping() 作为概念证明,同时花时间升级到 mysqli(我强烈推荐)。 p.s.这很可能是为什么也不适合你。希望这个帖子也能帮助其他人
【解决方案2】:

Baron Schwartz 在博客中指出,由于竞争条件,这种“写前检查”是一种不好的做法。他提倡使用 reconnect 在 catch 中的 try/catch 模式。这是他推荐的伪代码:

function query_database(connection, sql, retries=1)
   while true
      try
         result=connection.execute(sql)
         return result
      catch InactiveConnectionException e
         if retries > 0 then
            retries = retries - 1
            connection.reconnect()
         else
            throw e
         end
      end
   end
end

这是他的完整博客:https://www.percona.com/blog/2010/05/05/checking-for-a-live-database-connection-considered-harmful/

【讨论】:

    【解决方案3】:

    尝试使用 PHP 的 mysql_ping 函数:

    echo @mysql_ping() ? 'true' : 'false';
    

    您需要在前面加上“@”来假设您在未连接到数据库的情况下运行此函数会收到 MySQL 警告。

    还有其他方法,但这取决于您使用的代码。

    【讨论】:

    • @mailto,我同意,因为从来没有真正的好主意来抑制任何错误,但是......在这种情况下,它确实完成了工作。更好的选择是检查 mysql 资源。
    • 是的,它完成了工作,你甚至可以使用 eval() 来完成这个任务,但是可以吗?在我看来,我们应该始终寻求最好的解决方案:)
    • @mailo 但是如果还没有连接,你会怎么做呢?看到mysql_ping 会尝试用空数据建立连接?我认为没有办法避免@,除了为该行打开错误报告,这实际上是同一件事
    • @Pekka、ErrorExceptionset_error_handler()?
    • @ithcy 我不知道这会如何工作。如果您还没有使用它,那就太过分了,即使您正在使用它,您仍然必须确定您只是在调用mysql_ping。分析回溯?如果您想在其他地方调用 mysql_ping 但对错误采取不同的操作(例如显示它)怎么办?
    【解决方案4】:

    【讨论】:

    【解决方案5】:

    之前...(我的意思是在您不确定是否包含在其他文件中的某个位置)

    $db = mysql_connect()
    

    稍后...

    if (is_resource($db)) {
    // connected
    } else {
    $db = mysql_connect();
    }
    

    【讨论】:

    • 错了,mysql服务器可以消失
    • @azat 您是否曾经在 PHP 脚本中看到 mySQL 服务器在不是配置问题的情况下消失?
    • 查看我的编辑,当我说“之前”时,当然它不在同一个脚本中。加上问题是“数据库连接已经”。
    • @azat MySQL 消失主要与 max_allowed_pa​​cket 大小有关,如果发生,则会出现致命错误。如果还没有,我使用此代码关闭连接。
    【解决方案6】:
    // Earlier in your code
    mysql_connect();
    set_a_flag_that_db_is_connected();
    
    // Later....
    if (flag_is_set())
     mysql_connect(....);
    

    【讨论】:

    • 这是错误的,因为mysql服务器已经消失(超时关闭连接)
    • @azat PHP 脚本生命周期内的超时? OP 的问题中的什么给了你这个想法?
    • 所以..我们不知道他的脚本是做什么的,正确的设计是mysql_ping
    • @azat,阅读问题。 “它已经连接了吗?”不是说“我们丢了吗?”
    • @Capsule - 问:“它已经连接了吗?”,A:“它是,但现在不是了,我们丢失了它”:)
    猜你喜欢
    • 2015-04-06
    • 2012-08-26
    • 2016-11-17
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多