`
vtrtbb
  • 浏览: 361377 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Yii框架数据库写分离设计

 
阅读更多

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,
	                )
	            ),
        ),

 

至于说在程序总的调用,就没有什么区别了。

分享到:
评论

相关推荐

    YII2数据库MySQL复制和读写分离配置

    2. 自己编写读写分离逻辑,例如在YII2应用中,可以自定义组件来实现数据库连接的读写分离,通过配置不同的数据库连接池,区分读操作和写操作的数据库连接。 3. 利用YII2的数据库迁移(migrations)功能,可以单独对...

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

    Yii框架数据库多数据库、主从、读写分离 实现,功能描述: 1.实现主从数据库读写分离 主库:写 从库(可多个):读 2.主数据库无法连接时 可设置从数据库是否 可写 3.所有从数据库无法连接时 可设置主数据库是否 可读 4....

    php最新框架YII框架

    一、Yii框架概述: 1. 高性能:Yii通过使用缓存机制、优化的查询构建器和预编译的模板引擎等技术,提供了比其他PHP框架更快的运行速度。 2. MVC设计模式:遵循MVC模式,使得模型、视图和控制器之间职责分明,有利于...

    Yii框架详解

    Yii框架提供了一系列预构建的组件,如数据库访问对象(DAO)、ActiveRecord、MVC(模型-视图-控制器)架构等,使得开发者能够快速地搭建和开发Web应用。其内置的代码生成工具Gii可以帮助自动生成常见的CRUD操作和...

    Yii框架PDF中文文档

    ### Yii框架知识点总结 #### 一、概述与新特性 **Yii** 是一款高性能的PHP Web应用程序开发框架,以其简洁高效著称。该框架旨在帮助开发者快速构建安全且高效的Web应用。本文档根据官方中文文档及《Yii权威指南》...

    php开发yii框架软件包

    Yii框架是PHP开发中的一个高性能、基于组件的MVC(模型-视图-控制器)架构,专为开发者提升效率而设计。它具有优秀的性能、强大的缓存支持、灵活的数据库访问层以及丰富的类库,使得开发复杂的Web应用变得更加便捷。...

    基于Yii 框架开发的博客

    基于Yii框架开发的博客系统,充分利用了其优势,如MVC(Model-View-Controller)架构模式、数据库访问优化、缓存管理、身份验证和授权等特性。 首先,让我们深入了解一下Yii框架的核心特点: 1. **MVC设计模式**:...

    yii框架中文版手册pdf和chm格式

    - **MVC架构**:Yii中的MVC设计模式将业务逻辑、数据展示和用户交互分离开来,提高了代码的可读性和可维护性。 - **组件化设计**:Yii的核心功能通过组件实现,可以方便地扩展和复用。 - **自动加载**:Yii支持...

    YII框架翻译整理最终稿 -

    3. **MVC架构**:像许多其他 PHP 框架一样,Yii 遵循模型-视图-控制器(MVC)设计模式,有利于分离业务逻辑和表现层。 4. **丰富的功能**:Yii 内置了多种实用功能,包括缓存机制、安全防护、数据库访问对象(DAO)...

    PHP框架Yii商城源码,带数据库文件.rar

    Yii框架是PHP开发中的一个高性能、基于组件的MVC(模型-视图-控制器)框架,特别适合开发大型Web应用。...通过深入研究源码,开发者不仅可以提升Yii框架的掌握程度,还能学习到电子商务系统的设计和实现技巧。

    yii框架1.1.8

    11. **组件化设计**:Yii框架的核心是组件化,每个功能模块都可以视为一个组件,可复用、可组合,增强了框架的灵活性和可扩展性。 12. **性能优化**:Yii 1.1.8版通过编译视图文件、优化查询效率等方式,提升了整体...

    YII框架开源项目

    **Yii框架开源项目——iiSNS论坛** Yii是一款高性能、基于组件的PHP框架,用于开发Web2.0应用。它的名字“Yii”来源于中文“易”,意味着简单和优雅。Yii框架以其高效性能、灵活的配置和优秀的缓存管理机制而闻名,...

    yii框架语言基础

    - Yii框架的目标是实现业务逻辑与用户界面的分离,提高代码的可维护性和扩展性。在Yii中,业务逻辑由模型(Model)处理,用户界面由视图(View)渲染,而控制器(Controller)则负责处理用户输入和模型、视图之间的...

    Yii 读写分离 分表分库

    总结,通过Yii框架的灵活配置和扩展支持,我们可以实现读写分离和分库分表,有效提升系统的数据库性能。同时,需要注意在设计过程中充分考虑数据的一致性和查询的便利性,以确保系统的稳定性和可维护性。

    Yii框架快速入门

    ### Yii框架快速入门详解 #### 一、Yii框架概述 **Yii**,发音近似英文“Yee”或中文的“易”,是一个高效、组件化、面向大型Web应用的PHP开发框架。它由Martin Atsma于2008年发起,旨在提供一个灵活、高效且易于...

    yii php框架最新版本

    最新版本的Yii框架在保持其原有优势的基础上,进一步提升了性能和开发效率。 Yii框架的核心特性包括: 1. **高性能**:Yii使用缓存机制、预编译模板和高效的查询构建器等技术,确保了应用的快速响应。它还支持各种...

    yii框架 最新

    1. MVC架构:Yii遵循MVC设计模式,将业务逻辑、数据展示和用户界面分离,使得代码结构清晰,易于维护。模型负责处理数据,视图负责渲染输出,控制器则协调模型和视图,实现业务逻辑。 2. Active Record:Yii的...

    最新YII框架,解压可用

    最新版的Yii框架,即Yii 2.0.7,是经过精心设计和优化的,提供了许多增强特性和改进,以提升开发效率和应用性能。这个压缩包包含了一个基本的Yii 2项目结构,名为"basic",适合初学者快速上手。 Yii 2.0.7的关键...

Global site tag (gtag.js) - Google Analytics