如何在PHP中启用数据库自​​动重新连接?

时间:2009-06-11 17:20:01

标签: php mysql

,数据库是MYSQL

6 个答案:

答案 0 :(得分:7)

有时当您的MySQL连接打开时间过长时,如果没有查询的时间超过my.cnf中的wait_timeout值,则会删除与DB的连接。你会得到“MySQL服务器已经消失”的超时错误。

这是我在代码中实现自动重新连接的方式:

class databaseClass {
    var $conn;
    var $db;

    public function __construct() {
        $this->connect();
    }

    public function connect() {
        $this->conn = mysql_connect(DB_HOST, DB_USER, DB_PASS);
        $this->db = mysql_select_db(DB_NAME, $this->conn);
    }

    public function disconnect() {
        mysql_close($this->conn);
    }

    public function reconnect() {
        $this->disconnect();
        $this->connect();
    }

    public function queryCompanyExist($company) {
        //auto reconnect if MySQL server has gone away
        if (!mysql_ping($this->conn)) $this->reconnect();

        $query =  "SELECT name FROM company WHERE name='$company'";
        $result = mysql_query($query);
        if (!$result) print mysql_error() . "\r\n";
        return mysql_fetch_assoc($result);
    }
}

有关mysql_ping

的详情,请参阅此处

答案 1 :(得分:5)

来自C mysql API:

my_bool reconnect = 0; mysql_options(& mysql,MYSQL_OPT_RECONNECT,& reconnect); 见http://dev.mysql.com/doc/refman/5.6/en/auto-reconnect.html

从php.ini中的PHP mysqli设置全局: mysqli.reconnect =开 见http://www.php.net/manual/en/mysqli.configuration.php#ini.mysqli.reconnect

对于PHP PDO mysql驱动程序,它应该可以通过PDO :: setAttribute获得,但我无法找到指示它已实现的文档。代码似乎试图尊重MYSQL_OPT_RECONNECT,这是mysql现在需要的,但是在初始实现中没有这样做(https://bugs.php.net/bug.php?id=58863)。 58863中补丁的目的是允许:    新的PDO('mysql:host = xxx','xx','xx',array(PDO :: MYSQL_OPT_RECONNECT => true));

重新连接发生的原因是多种多样的,但通常是因为汇集的连接包含由于缺乏使用而导致超时的成熟连接。默认情况下,mysql连接在8小时后超时。请参阅:http://dev.mysql.com/doc/refman/5.6/en/gone-away.html

有关重新连接的副作用,请参阅:http://dev.mysql.com/doc/refman/5.6/en/auto-reconnect.html

答案 2 :(得分:2)

您可以使用mysql_ping()功能测试连接状态,并在返回false时重新连接。如果您在5.0.13之前使用MySQL,那么mysql_ping()甚至会为您重新连接,如文档页面所述; “自MySQL 5.0.13起,自动重新连接功能被禁用。”。

答案 3 :(得分:0)

您可以编写一个函数,通过连接ping数据库,如果它关闭,再次重新连接,然后继续查询或任何你想要的,也看看mysqli php库,它可以是对你有用。

PS。同样可以用来实现Singleton design pattern以维护数据库连接,一旦创建它将连接到数据库,然后你可以实现名为getConnection的方法,每次都将进行上面描述的检查。

PPS。您可以使用异常,尝试查询,无论何时捕获异常,重新连接并重试。

答案 4 :(得分:0)

您应该检查查询是否仍然失败。通过检查错误代码,您可以判断它是否因为没有连接而失败并重新连接。只需确保跟踪重新连接尝试,这样就不会陷入循环。

答案 5 :(得分:-1)

为什么你需要首先“重新连接”?你如何/为什么断开连接?在PHP中,您在脚本的开头连接,并在脚本结束时自动关闭连接。

根本不需要在脚本中调用mysql_close(如果明确关闭连接,“自动重新连接”会很愚蠢。)

你可以试试mysql_pconnect这就是你要找的东西。然后,连接将永久保持打开状态,连接的其他脚本可以使用该连接。