PHP veritabanı otomatik yeniden etkinleştirmek nasıl?

6 Cevap php

ve veritabanı MySQL

6 Cevap

C mysql API:

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

From PHP mysqli in php.ini set the global: mysqli.reconnect = On See http://www.php.net/manual/en/mysqli.configuration.php#ini.mysqli.reconnect

For the PHP PDO mysql driver it should be available through PDO::setAttribute but I am unable to find documentation indicating that it is implemented. The code appears to be attempting to respect the MYSQL_OPT_RECONNECT which is now required by mysql but to have failed to do so in the initial implementation (https://bugs.php.net/bug.php?id=58863). The intent of the patch in 58863 is to allow: new PDO('mysql:host=xxx', 'xx', 'xx',array(PDO::MYSQL_OPT_RECONNECT=>true));

Yeniden bağlanma oluşur neden Bunun çeşitli sebepleri vardır ama bağlantıların bir havuza dizi nedeniyle kullanım eksikliği doldu olgun bir bağlantısı içeren yaygın çünkü. 8 saat sonra, varsayılan MySQL bağlantı zaman aşımı tarafından. Bkz: http://dev.mysql.com/doc/refman/5.6/en/gone-away.html

Bir reconnection See yan etkileri için: http://dev.mysql.com/doc/refman/5.6/en/auto-reconnect.html

Sen bağlantı durumunu test ve döndüğünde yeniden için mysql_ping() işlevini kullanabilirsiniz false. Bu dokümantasyon sayfasında belirtildiği gibi 5.0.13 önce bir MySQL kullanıyorsanız () bile sizin için yeniden edecek mysql_ping; "MySQL 5.0.13 yana, otomatik yeniden bağlanma özelliği devre dışı.".

MySQL bağlantısı çok kez açıldığında Bazen, DB bağlantısı olmadan sorguya zaman my.cnf WAIT_TIMEOUT değerini excedes zaman bırakılır. Sen aşımı hatası "MySQL server has gone away" alırsınız.

Bu benim kod otomatik yeniden bağlanma uygulamak nasıl:

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 hakkında daha fazla bilgilenmek için buraya bakınız

Sen bağlantısı üzerinden ve durumda aşağı, yeniden yeniden ve daha sonra sorgu ya da ne istersen devam veritabanını ping olacak bir işlev yazabilirsiniz, ayrıca mysqli php kütüphanesinden bir göz atın, bu yararlı olabilir Senin için.

PS. Ayrıca veritabanına bağlanmak bir kez oluşturulan veritabanı bağlantısı, korumak ve daha sonra her zaman ben yukarıda açıklanan onay ile devam edecek getConnection denilen yöntemi uygulayabilirsiniz için Singleton design pattern uygulamak yararlı olabilir .

PPS. Sen, bir istisna kullanmak bir istisna yakalamak başarısız olduğunda, sorgu sizi denemek, yeniden ve tekrar deneyebilirsiniz.

Sorgu yine başarısız olursa kontrol edilmelidir. Hata kodunu kontrol ederek başarısız olursa, çünkü hiçbir bağlantısı anlatmak ve yeniden olabilir. Sadece bir döngü içinde sıkışmış alamadım bu yüzden size reconnection girişimleri takip emin olun.

Ilk etapta neden "yeniden" gerekiyor? Nasıl / neden kesilir alıyorsanız? PHP Eğer script başında bağlayın ve bağlantı yazısının sonunda otomatik olarak kapatılır.

Tüm adresinden komut mysql_close aramak için (ve bunu açıkça bağlantıyı kapattı eğer "otomatik olarak yeniden" saçma olurdu) gerek yok.

Sen mysql_pconnect Eğer bu sizin için ne arıyorsanız var olduğunu deneyebilirsiniz. Daha sonra bağlantı sürekli açık kalacak ve bağlanmak diğer komut bağlantısını kullanabilirsiniz.