Heim Backend-Entwicklung PHP-Tutorial Yii实现多数据库主从读写分离的方法_PHP

Yii实现多数据库主从读写分离的方法_PHP

May 31, 2016 pm 01:18 PM
yii 分离 多数据库 读写

本文实例讲述了Yii实现多数据库主从读写分离的方法。分享给大家供大家参考。具体分析如下:

Yii框架数据库多数据库、主从、读写分离 实现,功能描述:

1.实现主从数据库读写分离 主库:写 从库(可多个):读

2.主数据库无法连接时 可设置从数据库是否 可写

3.所有从数据库无法连接时 可设置主数据库是否 可读

4.如果从数据库连接失败 可设置N秒内不再连接

利用yii扩展实现,代码如下:

代码如下:

/**
 * 主数据库 写 从数据库(可多个)读
 * 实现主从数据库 读写分离 主服务器无法连接 从服务器可切换写功能
 * 从务器无法连接 主服务器可切换读功
 * by lmt
 * */
class DbConnectionMan extends CDbConnection {
    public $timeout = 10; //连接超时时间
    public $markDeadSeconds = 600; //如果从数据库连接失败 600秒内不再连接 
    //用 cache 作为缓存全局标记
    public $cacheID = 'cache';
 
    /**
     * @var array $slaves.Slave database connection(Read) config array.
     * 配置符合 CDbConnection.
     * @example
     * 'components'=>array(
     *   'db'=>array(
     *    'connectionString'=>'mysql://',
     *    'slaves'=>array(
     *     array('connectionString'=>'mysql://'),
     *     array('connectionString'=>'mysql://'),
     *    )
     *   )
     * )
     * */
    public $slaves = array();
    /**
     * 
     * 从数据库状态 false 则只用主数据库
     * @var bool $enableSlave
     * */
    public $enableSlave = true;
 
    /**
     * @var slavesWrite 紧急情况主数据库无法连接 切换从服务器(读写).
     */
    public $slavesWrite = false;
 
    /**
     * @var masterRead 紧急情况从主数据库无法连接 切换从住服务器(读写).
     */
    public $masterRead = false;
 
    /**
     * @var _slave
     */
    private $_slave;
 
    /**
     * @var _disableWrite 从服务器(只读).
     */
    private $_disableWrite = true;
 
    /**
     *
     * 重写 createCommand 方法,1.开启从库 2.存在从库 3.当前不处于一个事务中 4.从库读数据
     * @param string $sql
     * @return CDbCommand
     * */
    public function createCommand($sql = null) {
        if ($this->enableSlave && !emptyempty($this->slaves) && is_string($sql) && !$this->getCurrentTransaction() && self::isReadOperation($sql) && ($slave = $this->getSlave())
        ) {
            return $slave->createCommand($sql);
        } else {
            if (!$this->masterRead) {
                if ($this->_disableWrite && !self::isReadOperation($sql)) {
 
                    throw new CDbException("Master db server is not available now!Disallow write operation on slave server!");
                }
            }
            return parent::createCommand($sql);
        }
    }
 
    /**
     * 获得从服务器连接资源
     * @return CDbConnection
     * */
    public function getSlave() {
        if (!isset($this->_slave)) {
            shuffle($this->slaves);
            foreach ($this->slaves as $slaveConfig) {
                if ($this->_isDeadServer($slaveConfig['connectionString'])) {
                    continue;
                }
                if (!isset($slaveConfig['class']))
                    $slaveConfig['class'] = 'CDbConnection';
 
                $slaveConfig['autoConnect'] = false;
                try {
                    if ($slave = Yii::createComponent($slaveConfig)) {
                        Yii::app()->setComponent('dbslave', $slave);
                        $slave->setAttribute(PDO::ATTR_TIMEOUT, $this->timeout);
                        $slave->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
                        $slave->setActive(true);
                        $this->_slave = $slave;
                        break;
                    }
                } catch (Exception $e) {
                    $this->_markDeadServer($slaveConfig['connectionString']);
                    Yii::log("Slave database connection failed!ntConnection string:{$slaveConfig['connectionString']}", 'warning');
 
                    continue;
                }
            }
 
            if (!isset($this->_slave)) {
                $this->_slave = null;
                $this->enableSlave = false;
            }
        }
        return $this->_slave;
    }
 
    public function setActive($value) {
        if ($value != $this->getActive()) {
            if ($value) {
                try {
                    if ($this->_isDeadServer($this->connectionString)) {
                        throw new CDbException('Master db server is already dead!');
                    }
                    //PDO::ATTR_TIMEOUT must set before pdo instance create
                    $this->setAttribute(PDO::ATTR_TIMEOUT, $this->timeout);
                    $this->open();
                } catch (Exception $e) {
                    $this->_markDeadServer($this->connectionString);
                    $slave = $this->getSlave();
                    Yii::log($e->getMessage(), CLogger::LEVEL_ERROR, 'exception.CDbException');
                    if ($slave) {
                        $this->connectionString = $slave->connectionString;
                        $this->username = $slave->username;
                        $this->password = $slave->password;
                        if ($this->slavesWrite) {
                            $this->_disableWrite = false;
                        }
                        $this->open();
                    } else { //Slave also unavailable
                        if ($this->masterRead) {
                            $this->connectionString = $this->connectionString;
                            $this->username = $this->username;
                            $this->password = $this->password;
                            $this->open();
                        } else {
                            throw new CDbException(Yii::t('yii', 'CDbConnection failed to open the DB connection.'), (int) $e->getCode(), $e->errorInfo);
                        }
                    }
                }
            } else {
                $this->close();
            }
        }
    }
 
    /**
     * 检测读操作 sql 语句
     * 
     * 关键字: SELECT,DECRIBE,SHOW ...
     * 写操作:UPDATE,INSERT,DELETE ...
     * */
    public static function isReadOperation($sql) {
        $sql = substr(ltrim($sql), 0, 10);
        $sql = str_ireplace(array('SELECT', 'SHOW', 'DESCRIBE', 'PRAGMA'), '^O^', $sql); //^O^,magic smile
        return strpos($sql, '^O^') === 0;
    }
 
    /**
     * 检测从服务器是否被标记 失败.
     */
    private function _isDeadServer($c) {
        $cache = Yii::app()->{$this->cacheID};
        if ($cache && $cache->get('DeadServer::' . $c) == 1) {
            return true;
        }
        return false;
    }
 
    /**
     * 标记失败的slaves.
     */
    private function _markDeadServer($c) {
        $cache = Yii::app()->{$this->cacheID};
        if ($cache) {
            $cache->set('DeadServer::' . $c, 1, $this->markDeadSeconds);
        }
    }
}


main.php配置:components 数组中,代码如下:

代码如下:

'db'=>array(
        'class'=>'application.extensions.DbConnectionMan',//扩展路径
        'connectionString' => 'mysql:host=192.168.1.128;dbname=db_xcpt',//主数据库 写
        'emulatePrepare' => true,
        'username' => 'root',
        'password' => 'root',
        'charset' => 'utf8',
        'tablePrefix' => 'xcpt_', //表前缀
        'enableSlave'=>true,//从数据库启用
   'urgencyWrite'=>true,//紧急情况 主数据库无法连接 启用从数据库 写功能
    'masterRead'=>true,//紧急情况 从数据库无法连接 启用主数据库 读功能
        'slaves'=>array(//从数据库
            array(   //slave1
                'connectionString'=>'mysql:host=localhost;dbname=db_xcpt',
                'emulatePrepare' => true,
                'username'=>'root',
                'password'=>'root',
                'charset' => 'utf8',
                'tablePrefix' => 'xcpt_', //表前缀
            ),
   array(   //slave2
                'connectionString'=>'mysql:host=localhost;dbname=db_xcpt',
                'emulatePrepare' => true,
                'username'=>'root',
                'password'=>'root',
                'charset' => 'utf8',
                'tablePrefix' => 'xcpt_', //表前缀
            ),
 
        ),
),

希望本文所述对大家基于Yii框架的php程序设计有所帮助。

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Verwendung von PHP zum Implementieren von Daten-Caching-, Lese- und Schreibfunktionen Verwendung von PHP zum Implementieren von Daten-Caching-, Lese- und Schreibfunktionen Sep 05, 2023 pm 05:45 PM

Verwendung von PHP zum Implementieren von Daten-Caching und Lese-/Schreibfunktionen. Durch Caching können häufig verwendete Daten im Speicher gespeichert werden, um die Lesegeschwindigkeit von Daten zu erhöhen. In PHP können wir verschiedene Methoden verwenden, um Daten-Caching sowie Lese- und Schreibfunktionen zu implementieren. In diesem Artikel werden zwei gängige Methoden vorgestellt: die Verwendung von Datei-Caching und die Verwendung von Speicher-Caching. 1. Beim Datei-Caching werden Daten zum späteren Lesen in Dateien gespeichert. Im Folgenden finden Sie einen Beispielcode, der Datei-Caching zum Lesen und Schreiben von Daten verwendet:

So entwickeln Sie mit dem PHP-Framework Yii ein hochverfügbares Cloud-Backup-System So entwickeln Sie mit dem PHP-Framework Yii ein hochverfügbares Cloud-Backup-System Jun 27, 2023 am 09:04 AM

Mit der kontinuierlichen Weiterentwicklung der Cloud-Computing-Technologie ist die Datensicherung zu etwas geworden, das jedes Unternehmen durchführen muss. In diesem Zusammenhang ist es besonders wichtig, ein hochverfügbares Cloud-Backup-System zu entwickeln. Das PHP-Framework Yii ist ein leistungsstarkes Framework, das Entwicklern dabei helfen kann, schnell leistungsstarke Webanwendungen zu erstellen. Im Folgenden wird vorgestellt, wie Sie mit dem Yii-Framework ein hochverfügbares Cloud-Backup-System entwickeln. Entwerfen des Datenbankmodells Im Yii-Framework ist das Datenbankmodell ein sehr wichtiger Teil. Denn das Datensicherungssystem erfordert viele Tabellen und Beziehungen

So verwenden Sie das Modulsystem in Java 9 zum Trennen und Isolieren von Code So verwenden Sie das Modulsystem in Java 9 zum Trennen und Isolieren von Code Jul 30, 2023 pm 07:46 PM

So verwenden Sie das Modulsystem in Java 9 zum Trennen und Isolieren von Code. Da der Umfang der Software weiter zunimmt, nimmt auch die Komplexität des Codes weiter zu. Um Code besser zu organisieren und zu verwalten, führte Java9 das Modulsystem ein. Das Aufkommen des Modulsystems löst das Problem traditioneller Paketabhängigkeiten und macht die Trennung und Isolierung von Code einfacher und flexibler. In diesem Artikel wird erläutert, wie Sie mithilfe des Modulsystems in Java 9 eine Codetrennung und -isolierung erreichen. 1. Definition des Moduls In Java9 können wir zum Definieren das Schlüsselwort module verwenden

Symfony vs Yii2: Welches Framework eignet sich besser für die Entwicklung umfangreicher Webanwendungen? Symfony vs Yii2: Welches Framework eignet sich besser für die Entwicklung umfangreicher Webanwendungen? Jun 19, 2023 am 10:57 AM

Da die Nachfrage nach Webanwendungen weiter wächst, haben Entwickler bei der Auswahl von Entwicklungsframeworks immer mehr Möglichkeiten. Symfony und Yii2 sind zwei beliebte PHP-Frameworks. Sie verfügen beide über leistungsstarke Funktionen und Leistung. Welches Framework ist jedoch besser geeignet, wenn es darum geht, umfangreiche Webanwendungen zu entwickeln? Als nächstes führen wir eine vergleichende Analyse von Symphony und Yii2 durch, um Ihnen zu helfen, eine bessere Wahl zu treffen. Grundlegende Übersicht Symphony ist ein Open-Source-Webanwendungs-Framework, das in PHP geschrieben ist und darauf aufbaut

Vorschläge zur Front-End-Technologieauswahl bei der Golang-Front-End- und Back-End-Trennungsentwicklung. Vorschläge zur Front-End-Technologieauswahl bei der Golang-Front-End- und Back-End-Trennungsentwicklung. Mar 05, 2024 pm 12:12 PM

Titel: Vorschläge zur Auswahl der Front-End-Technologie in der Front-End- und Back-End-Trennungsentwicklung von Golang Da die Komplexität und Anforderungen von Webanwendungen weiter zunehmen, wird das Front-End- und Back-End-Trennungsentwicklungsmodell immer beliebter. In diesem Entwicklungsmodell ist das Backend für die Verarbeitung der Geschäftslogik verantwortlich, und das Frontend ist für die Anzeige von Seiten und die Interaktion mit Benutzern verantwortlich. Die beiden kommunizieren über APIs. Für Entwicklungsteams, die Golang als Back-End-Sprache verwenden, ist die Wahl der richtigen Front-End-Technologie von entscheidender Bedeutung. In diesem Artikel werden die empfohlenen Front-End-Technologien zur Auswahl bei der separaten Entwicklung von Front-End und Back-End in Golang erläutert

Tipps zur Unterstützung mehrerer Datenbanken im Django-Framework Tipps zur Unterstützung mehrerer Datenbanken im Django-Framework Jun 18, 2023 am 10:52 AM

Django ist ein beliebtes Python-Webframework. Sein hervorragender ORM-Mechanismus (Object Relational Mapping) ermöglicht Entwicklern den einfachen Betrieb von Datenbanken. In einigen tatsächlichen Projekten müssen jedoch mehrere Datenbanken verbunden werden. Zu diesem Zeitpunkt sind einige Fähigkeiten erforderlich, um die Stabilität und Entwicklungseffizienz des Projekts sicherzustellen. In Django basiert die Unterstützung mehrerer Datenbanken auf den Funktionen, die vom Django-Framework selbst bereitgestellt werden. Hier stellen wir einige Tipps zur Unterstützung mehrerer Datenbanken vor, die Ihnen bei der besseren Entwicklung in Django helfen sollen

Datenabfrage im Yii-Framework: Effizienter Zugriff auf Daten Datenabfrage im Yii-Framework: Effizienter Zugriff auf Daten Jun 21, 2023 am 11:22 AM

Das Yii-Framework ist ein Open-Source-PHP-Webanwendungsframework, das zahlreiche Tools und Komponenten zur Vereinfachung des Prozesses der Webanwendungsentwicklung bereitstellt, wobei die Datenabfrage eine der wichtigen Komponenten ist. Im Yii-Framework können wir eine SQL-ähnliche Syntax verwenden, um auf die Datenbank zuzugreifen und Daten effizient abzufragen und zu bearbeiten. Der Abfrage-Builder des Yii-Frameworks umfasst hauptsächlich die folgenden Typen: ActiveRecord-Abfrage, QueryBuilder-Abfrage, Befehlsabfrage und Original-SQL-Abfrage

Wie verwende ich das Yii3-Framework in PHP? Wie verwende ich das Yii3-Framework in PHP? May 31, 2023 pm 10:42 PM

Mit der Weiterentwicklung des Internets wird auch die Nachfrage nach der Entwicklung von Webanwendungen immer größer. Für Entwickler erfordert die Entwicklung von Anwendungen ein stabiles, effizientes und leistungsstarkes Framework, das die Entwicklungseffizienz verbessern kann. Yii ist ein führendes Hochleistungs-PHP-Framework, das umfangreiche Funktionen und gute Leistung bietet. Yii3 ist die nächste Generation des Yii-Frameworks, das die Leistung und Codequalität basierend auf Yii2 weiter optimiert. In diesem Artikel stellen wir vor, wie Sie das Yii3-Framework zum Entwickeln von PHP-Anwendungen verwenden.

See all articles