stripos(thinkphp下MySQL数据库读写分离代码剖析)

1. stripos,thinkphp下MySQL数据库读写分离代码剖析?

当采用原生态的sql语句进行写入操作的时候,要用execute,读操作要用query。

MySQL数据主从同步还是要靠MySQL的机制来实现,所以这个时候Mysql主从同步的延迟问题是需要优化,延迟时间太长不仅影响业务,还影响用户体验。

thinkphp核心类Thinkphp/library/Model.class.php 中,query 方法

调用Thinkphp/library/Think/Db/Driver/Mysql.class.php

/**

* SQL查询

* @access public

* @param string $sql SQL

* @param mixed $parse 是否需要解析SQL

* @return mixed

*/

public function query($sql,$parse=false) {

if(!is_bool($parse) && !is_array($parse)) {

$parse = func_get_args();

array_shift($parse);

}

$sql = $this->parseSql($sql,$parse);

return $this->db->query($sql);

}

调用Thinkphp/library/Think/Db/Driver/Mysql.class.php

/**

* 执行查询 返回数据集

* @access public

* @param string $str sql指令

* @return mixed

*/

public function query($str) {

if(0===stripos($str, 'call')){ // 存储过程查询支持

$this->close();

$this->connected = false;

}

$this->initConnect(false);

if ( !$this->_linkID ) return false;

$this->queryStr = $str;

//释放前次的查询结果

if ( $this->queryID ) { $this->free(); }

N('db_query',1);

// 记录开始执行时间

G('queryStartTime');

$this->queryID = mysql_query($str, $this->_linkID);

$this->debug();

if ( false === $this->queryID ) {

$this->error();

return false;

} else {

$this->numRows = mysql_num_rows($this->queryID);

return $this->getAll();

}

}

上面初始化数据库链接时,initConnect(false),调用Thinkphp/library/Think/Db/Db.class.php,注意false、true代码实现。true表示直接调用主库,false表示调用读写分离的读库。

/**

* 初始化数据库连接

* @access protected

* @param boolean $master 主服务器

* @return void

*/

protected function initConnect($master=true) {

if(1 == C('DB_DEPLOY_TYPE'))

// 采用分布式数据库

$this->_linkID = $this->multiConnect($master);

else

// 默认单数据库

if ( !$this->connected ) $this->_linkID = $this->connect();

}

/**

* 连接分布式服务器

* @access protected

* @param boolean $master 主服务器

* @return void

*/

protected function multiConnect($master=false) {

foreach ($this->config as $key=>$val){

$_config[$key] = explode(',',$val);

}

// 数据库读写是否分离

if(C('DB_RW_SEPARATE')){

// 主从式采用读写分离

if($master)

// 主服务器写入

$r = floor(mt_rand(0,C('DB_MASTER_NUM')-1));

else{

if(is_numeric(C('DB_SLAVE_NO'))) {// 指定服务器读

$r = C('DB_SLAVE_NO');

}else{

// 读操作连接从服务器

免责声明:本文作者:“游客”,版权归作者所有,观点仅代表作者本人。本站仅提供信息存储分享服务,不拥有所有权。信息贵在分享,如有侵权请联系ynstorm@foxmail.com,我们将在24小时内对侵权内容进行删除。
(162)
cogoo(在日本共享单车是一种什么样的
上一篇 2023年11月05日
小米手机发布会直播(怎么参加雷军的发布会
下一篇 2023年11月05日

相关推荐

  • 升级鸿蒙系统步骤(荣耀magic5至臻版怎么升级鸿蒙)

    荣耀magic5预装的是magicUi系统目前是不能升级华为鸿蒙系统的,不排除以后荣耀会接入鸿蒙系统。才能升级鸿蒙系统。...

    2023年11月02日
  • lily camera(大疆无人机Mavic)

    在今年的1月25日,大疆创新在上海举行了MavicAir无人机在国内的首次体验活动,笔者有幸从参加,并在在活动结束后也收到了这款全新的MavicAir无人机,不过由于北京严格的禁飞规定,想要体验却一直没有机会,于是正好凑着春节放假,在家乡小城...

    2023年11月07日
  • bios设置光盘启动(电脑怎么设置为从光盘启动)

    1,进入BIOS设置光驱启动,开机后即刻按delete或者F1,进入BIOS,找到BOOT,然后选择FirstBOOT,将这一项改成CDROM,然后按F10保存。...

    2023年11月09日
  • 联想k900上市时间(ZUK手机还会回来吗)

    先评价一下吧,z1确实是一部性价比超高的手机,既然提到性价比,那肯定就不是性能怪兽,CPU的频率限制了zuk的地位。但是大容量的存储和大容量的电池,在当时除了山寨机还是为数不多的,加上刚才说到的CPU,续航本该是出类拔萃的,但是由于自己的后台...

    2023年11月15日
  • 启动命令(苹果快捷指令只显示不运行)

    升级iOS13以后,快捷指令App也迎来全新版本,新设计的快捷指令App有诸多不同,尤其在权限控制上更为严格,这导致部分快捷指令打开时报错的问题。...

    2023年11月17日
  • 金立e6mini(amiqo是什么牌子手机)

    Amigo在西班牙语当中是“朋友”的意思,金立从ELIFEE6开始,完全采用其基于Android深度研发的Amigo自主操作系统。根据金立副总裁卢伟冰先生解释,e-life本身就是面向年轻用户群体,而Amigo本身含有的朋友意义,也与e-li...

    2023年11月21日
  • 昭阳k47(iml怎么设置bios)

    适用范围:IdeaPadYZG系列机型全系列笔记本、LenovoErazerZNY全系列笔记本、昭阳系列K47、E47及更早产品、扬天系列V470、B470及更早产品、早期旭日、天逸全系列笔记本。...

    2023年11月30日
  • 电脑椅子(这几个的英语单词是怎样的)

    答:身高160cm电脑桌72cm,这样身高不算很高,电脑桌高72cm,也只是标准的桌高,不论什么桌子标准的高度都在78一80Cm,标准的椅子高度38一40cm,即然72不是标准高度那么椅子也要配矮一点的比较适合,椅子高度配34一36Cm合适。...

    2023年12月02日
  • script error(error电脑开机出现这个代码)

    没有代码,没有100%报错信息,不好判断。对照这个看看ShellScriptSyntaxError:UnexpectedEndofFile...

    2023年12月03日
  • xp系统美化(win7和XP区别)

    win7系统界面很华丽,视觉效果好,使用体验相对较好。win7不需要太高的系统配置,略高于xp,一般新买的电脑系统配置都能支持win7。...

    2023年12月03日
返回顶部