PHP bir veritabanı sunucusu diğerine yerine çalışma için bir yerleşik bir mekanizma var mı?

4 Cevap php

Bunu buldum:

http://www.evolt.org/failover-database-connection-with-php-mysql

ve benzer örnekler. Ama daha iyi bir yolu var mı?

Ben MS SQL Native Client Automatic Failover Client çizgisinde düşünüyorum.

4 Cevap

Bu sistem düzeyinde başarısızlık stratejileri işlemek geleneksel bulunuyor; bu şekilde tüm uygulamalar sağlam bir ortam tadını çıkarabilirsiniz.

I MySQL failover strategy ve MySQL proxy başvurmak istiyorum. İkincisi yük dengeleme ve yedeklik yapabileceği bir MySQL programı açıklanır ve kurmak oldukça kolay görünüyor.

Değil soruya cevabı, ancak yerine çalışma işlemek için daha yaygın bir çözümdür.

PHP bu işlemek için yerleşik bir şey yok. Sen kodu kendiniz yazmak zorunda.

En iyi yaklaşım, soyut veritabanı erişimi olması ve yük devretme mantığı kozalayabilirsiniz bir sınıf yaratacak.

İşte bazı kod manşet kapalı, bulunuyor:

interface MySQL_Interface {
    public function query($sql);
}

class MySQL_Concrete implements MySQL_Interface {
    public function __construct($host, $user, $pass, $dbname) {
        $this->_mysql = mysql_connect($host, $user, $pass) or throw Exception("Could not connect to server");
        mysql_select_db($db, $this->_mysql) or throw Exception("Could not connect to database");
    }
    public function query($sql) {
        return mysql_query($sql) or throw new Exception("Query failed");
    }
}

class MySQL_Failover implements MySQL_Interface {
    public function __construct(MySQL_Interface $one, MySQL_Interface $two) {
        $this->_one = $one;
        $this->_two = $two;
    }
    public function query($sql) {
        try {
            return $this->_one->query($sql);
        } catch (Exception $e) {
            return $this->_two->query($sql);
        }
    }
}

$db = new MySQL_Failover(
    new MySQL_Concrete('host1', 'user', 'pass', 'db'),
    new MySQL_Concrete('host2', 'user', 'pass', 'db')
);

$db->query('SELECT * FROM Users');

PS: I've left quite a bit out of here, it's not to be used verbatim.

* PPS: Herhalde * Varolan bir veritabanı soyutlama kitaplığı (Zend_Db, MDB2, vb) kullanmak yerine, kendi ad-hoc çözüm oluşturma kendi arabirimini uygulamak için daha iyi olurdu

Hayır, bu kolay bir yol istihdam olduğunu düşünüyorum o içeri inşa yoktur MySQL Proxy. Aksi takdirde, ancak logic (if (fails) { connect to another }) uygulamanızda, ancak bu performans açısından çok güzel ve büyük değil.

muhtemel iyi bir neden için - php hiçbir yük devretme mekanizması inşa etti. Böyle başarısızlık sistemi işletim sistemi veya donanım seviyesinde uygulanmalıdır.

Zaten sizin örnek ucuz ve basit bir yük devretme mekanizması sağlar.