Yii框架在php中算是个流行的框架了,目前多数开发者都在使用。目前项目中使用mysql数据库主从分离的方式已经成为了常态。在Yii里如何实现呢?
1、首先需要自己写一个数据库的主从连接类。
2、把这个类注册到config目录的main文件里。
3、实现思路是遇到SELECT,SHOW等语句时自动切换到从库。
数据库连接类:
<?php class DbConnection extends CDbConnection { /** * @var array $slaves.Slave database connection(Read) config array. * The array value's format is the same as CDbConnection. * <code> * 'components'=>array( * 'db'=>array( * 'class' => 'DbConnection', * 'connectionString'=>'mysql://<master>', * 'slaves'=>array( * array('connectionString'=>'mysql://<slave01>'), * array('connectionString'=>'mysql://<slave02>'), * ) * ) * ) * </code> */ public $slaves = array(); /** * Whether enable the slave database connection. * Defaut is true.Set this property to false for the purpose of only use the master database. * * @var bool $enableSlave */ public $enableSlave = true; /** * @override * @var bool $autoConnect Whether connect while init */ //public $autoConnect=false; /** * @var CDbConnection */ private $_slave; /** * Creates a CDbCommand object for excuting sql statement. * It will detect the sql statement's behavior. * While the sql is a simple read operation. * It will use a slave database connection to contruct a CDbCommand object. * Default it use current connection(master database). * * @override * @param string $sql * @return CDbCommand */ public function createCommand($query = null) { if ($this->enableSlave && !$this->getCurrentTransaction() && self::isReadOperation($query)) { return $this->getSlave()->createCommand($query); } else { return parent::createCommand($query); } } /** * Construct a slave connection CDbConnection for read operation. * * @return CDbConnection */ public function getSlave() { if (!isset($this->_slave)) { foreach ($this->slaves as $slaveConfig) { if (!isset($slaveConfig['class'])) $slaveConfig['class'] = 'CDbConnection'; try { if ($slave = Yii::createComponent($slaveConfig)) { Yii::app()->setComponent('dbslave', $slave); $this->_slave = $slave; break; } } catch (Exception $e) { Yii::log('Create slave database connection failed!', 'warn'); continue; } } if (!$this->_slave) { $this->_slave = clone $this; $this->_slave->enableSlave = false; } } return $this->_slave; } /** * Detect whether the sql statement is just a simple read operation. * Read Operation means this sql will not change any thing ang aspect of the database. * Such as SELECT,DECRIBE,SHOW etc. * On the other hand:UPDATE,INSERT,DELETE is write operation. * * @return bool */ public function isReadOperation($sql) { return !!preg_match('/^\s*(SELECT|SHOW|DESCRIBE|PRAGMA)/i', $sql); } /** * check Master | slave db is connection * * @params bool $isSlave * @return void */ public function ping($isSlave = true) { if ($isSlave) { if ($this->getActive()) { $connect = $this->getSlave(); try { $connect->getPdoInstance()->query('SELECT 1'); } catch (PDOException $e) { $connect->setActive(false); $connect->setActive(true); } } } else { if ($this->getActive()) { try { $this->getPdoInstance()->query('SELECT 1'); } catch (PDOException $e) { $this->setActive(false); $this->setActive(true); } } } } }
然后把这个类注册到main.php 中:
'public_db_common' => array( 'class' => 'DbConnection', //这个就是上面的DbConnection类 'connectionString' => "mysql:host=;dbname=;port=", 'emulatePrepare' => true, 'username' => , 'password' => , 'tablePrefix' => 't_', 'charset' => 'utf8', 'enableProfiling' => true, // 'enableParamLogging' => true, // 'slaves' => array( array( 'connectionString' => "mysql:host=;dbname=;port=", 'emulatePrepare' => true, 'username' => , 'password' => , 'charset' => 'UTF8', 'tablePrefix' => 't_', 'enableParamLogging' => YII_DEBUG, 'schemaCacheID' => 'cache', 'schemaCachingDuration' => 0, ) ), ),
至于说在程序总的调用,就没有什么区别了。
相关推荐
2. 自己编写读写分离逻辑,例如在YII2应用中,可以自定义组件来实现数据库连接的读写分离,通过配置不同的数据库连接池,区分读操作和写操作的数据库连接。 3. 利用YII2的数据库迁移(migrations)功能,可以单独对...
Yii框架数据库多数据库、主从、读写分离 实现,功能描述: 1.实现主从数据库读写分离 主库:写 从库(可多个):读 2.主数据库无法连接时 可设置从数据库是否 可写 3.所有从数据库无法连接时 可设置主数据库是否 可读 4....
一、Yii框架概述: 1. 高性能:Yii通过使用缓存机制、优化的查询构建器和预编译的模板引擎等技术,提供了比其他PHP框架更快的运行速度。 2. MVC设计模式:遵循MVC模式,使得模型、视图和控制器之间职责分明,有利于...
Yii框架提供了一系列预构建的组件,如数据库访问对象(DAO)、ActiveRecord、MVC(模型-视图-控制器)架构等,使得开发者能够快速地搭建和开发Web应用。其内置的代码生成工具Gii可以帮助自动生成常见的CRUD操作和...
### Yii框架知识点总结 #### 一、概述与新特性 **Yii** 是一款高性能的PHP Web应用程序开发框架,以其简洁高效著称。该框架旨在帮助开发者快速构建安全且高效的Web应用。本文档根据官方中文文档及《Yii权威指南》...
Yii框架是PHP开发中的一个高性能、基于组件的MVC(模型-视图-控制器)架构,专为开发者提升效率而设计。它具有优秀的性能、强大的缓存支持、灵活的数据库访问层以及丰富的类库,使得开发复杂的Web应用变得更加便捷。...
基于Yii框架开发的博客系统,充分利用了其优势,如MVC(Model-View-Controller)架构模式、数据库访问优化、缓存管理、身份验证和授权等特性。 首先,让我们深入了解一下Yii框架的核心特点: 1. **MVC设计模式**:...
- **MVC架构**:Yii中的MVC设计模式将业务逻辑、数据展示和用户交互分离开来,提高了代码的可读性和可维护性。 - **组件化设计**:Yii的核心功能通过组件实现,可以方便地扩展和复用。 - **自动加载**:Yii支持...
3. **MVC架构**:像许多其他 PHP 框架一样,Yii 遵循模型-视图-控制器(MVC)设计模式,有利于分离业务逻辑和表现层。 4. **丰富的功能**:Yii 内置了多种实用功能,包括缓存机制、安全防护、数据库访问对象(DAO)...
Yii框架是PHP开发中的一个高性能、基于组件的MVC(模型-视图-控制器)框架,特别适合开发大型Web应用。...通过深入研究源码,开发者不仅可以提升Yii框架的掌握程度,还能学习到电子商务系统的设计和实现技巧。
11. **组件化设计**:Yii框架的核心是组件化,每个功能模块都可以视为一个组件,可复用、可组合,增强了框架的灵活性和可扩展性。 12. **性能优化**:Yii 1.1.8版通过编译视图文件、优化查询效率等方式,提升了整体...
**Yii框架开源项目——iiSNS论坛** Yii是一款高性能、基于组件的PHP框架,用于开发Web2.0应用。它的名字“Yii”来源于中文“易”,意味着简单和优雅。Yii框架以其高效性能、灵活的配置和优秀的缓存管理机制而闻名,...
- Yii框架的目标是实现业务逻辑与用户界面的分离,提高代码的可维护性和扩展性。在Yii中,业务逻辑由模型(Model)处理,用户界面由视图(View)渲染,而控制器(Controller)则负责处理用户输入和模型、视图之间的...
总结,通过Yii框架的灵活配置和扩展支持,我们可以实现读写分离和分库分表,有效提升系统的数据库性能。同时,需要注意在设计过程中充分考虑数据的一致性和查询的便利性,以确保系统的稳定性和可维护性。
### Yii框架快速入门详解 #### 一、Yii框架概述 **Yii**,发音近似英文“Yee”或中文的“易”,是一个高效、组件化、面向大型Web应用的PHP开发框架。它由Martin Atsma于2008年发起,旨在提供一个灵活、高效且易于...
最新版本的Yii框架在保持其原有优势的基础上,进一步提升了性能和开发效率。 Yii框架的核心特性包括: 1. **高性能**:Yii使用缓存机制、预编译模板和高效的查询构建器等技术,确保了应用的快速响应。它还支持各种...
1. MVC架构:Yii遵循MVC设计模式,将业务逻辑、数据展示和用户界面分离,使得代码结构清晰,易于维护。模型负责处理数据,视图负责渲染输出,控制器则协调模型和视图,实现业务逻辑。 2. Active Record:Yii的...
最新版的Yii框架,即Yii 2.0.7,是经过精心设计和优化的,提供了许多增强特性和改进,以提升开发效率和应用性能。这个压缩包包含了一个基本的Yii 2项目结构,名为"basic",适合初学者快速上手。 Yii 2.0.7的关键...