成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

thinkphp 下數(shù)據(jù)庫讀寫分離代碼剖析

sunsmell / 1360人閱讀

摘要:核心類中,方法,調(diào)用查詢是否需要解析調(diào)用執(zhí)行查詢返回?cái)?shù)據(jù)集指令存儲(chǔ)過程查詢支持釋放前次的查詢結(jié)果記錄開始執(zhí)行時(shí)間上面初始化數(shù)據(jù)庫鏈接時(shí),,調(diào)用注意代碼實(shí)現(xiàn)。表示直接調(diào)用主庫,表示調(diào)用讀寫分離的讀庫。

當(dāng)采用原生態(tài)的sql語句進(jìn)行寫入操作的時(shí)候,要用execute,讀操作要用query。

MySQL數(shù)據(jù)主從同步還是要靠MySQL的機(jī)制來實(shí)現(xiàn),所以這個(gè)時(shí)候MySQL主從同步的延遲問題是需要優(yōu)化,延遲時(shí)間太長(zhǎng)不僅影響業(yè)務(wù),還影響用戶體驗(yàn)。

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

    調(diào)用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);
    }
    調(diào)用Thinkphp/library/Think/Db/Driver/Mysql.class.php
    /**
     * 執(zhí)行查詢 返回?cái)?shù)據(jù)集
     * @access public
     * @param string $str  sql指令
     * @return mixed
     */
    public function query($str) {
        if(0===stripos($str, "call")){ // 存儲(chǔ)過程查詢支持
            $this->close();
            $this->connected    =   false;
        }
        $this->initConnect(false);
        if ( !$this->_linkID ) return false;
        $this->queryStr = $str;
        //釋放前次的查詢結(jié)果
        if ( $this->queryID ) {    $this->free();    }
        N("db_query",1);
        // 記錄開始執(zhí)行時(shí)間
        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();
        }
    }

上面初始化數(shù)據(jù)庫鏈接時(shí),initConnect(false),調(diào)用Thinkphp/library/Think/Db/Db.class.php,注意false、true代碼實(shí)現(xiàn)。true表示直接調(diào)用主庫,false表示調(diào)用讀寫分離的讀庫。

    /**
     * 初始化數(shù)據(jù)庫連接
     * @access protected
     * @param boolean $master 主服務(wù)器
     * @return void
     */
    protected function initConnect($master=true) {
        if(1 == C("DB_DEPLOY_TYPE"))
            // 采用分布式數(shù)據(jù)庫
            $this->_linkID = $this->multiConnect($master);
        else
            // 默認(rèn)單數(shù)據(jù)庫
            if ( !$this->connected ) $this->_linkID = $this->connect();
    }

    /**
     * 連接分布式服務(wù)器
     * @access protected
     * @param boolean $master 主服務(wù)器
     * @return void
     */
    protected function multiConnect($master=false) {
        foreach ($this->config as $key=>$val){
            $_config[$key]      =   explode(",",$val);
        }        
        // 數(shù)據(jù)庫讀寫是否分離
        if(C("DB_RW_SEPARATE")){
            // 主從式采用讀寫分離
            if($master)
                // 主服務(wù)器寫入
                $r  =   floor(mt_rand(0,C("DB_MASTER_NUM")-1));
            else{
                if(is_numeric(C("DB_SLAVE_NO"))) {// 指定服務(wù)器讀
                    $r = C("DB_SLAVE_NO");
                }else{
                    // 讀操作連接從服務(wù)器
                    $r = floor(mt_rand(C("DB_MASTER_NUM"),count($_config["hostname"])-1));   // 每次隨機(jī)連接的數(shù)據(jù)庫
                }
            }
        }else{
            // 讀寫操作不區(qū)分服務(wù)器
            $r = floor(mt_rand(0,count($_config["hostname"])-1));   // 每次隨機(jī)連接的數(shù)據(jù)庫
        }
        $db_config = array(
            "username"  =>  isset($_config["username"][$r])?$_config["username"][$r]:$_config["username"][0],
            "password"  =>  isset($_config["password"][$r])?$_config["password"][$r]:$_config["password"][0],
            "hostname"  =>  isset($_config["hostname"][$r])?$_config["hostname"][$r]:$_config["hostname"][0],
            "hostport"  =>  isset($_config["hostport"][$r])?$_config["hostport"][$r]:$_config["hostport"][0],
            "database"  =>  isset($_config["database"][$r])?$_config["database"][$r]:$_config["database"][0],
            "dsn"       =>  isset($_config["dsn"][$r])?$_config["dsn"][$r]:$_config["dsn"][0],
            "params"    =>  isset($_config["params"][$r])?$_config["params"][$r]:$_config["params"][0],
            "charset"   =>  isset($_config["charset"][$r])?$_config["charset"][$r]:$_config["charset"][0],            
        );
        return $this->connect($db_config,$r);
    }

query方法參數(shù)為false,其他刪除、更新、增加讀主庫。這一點(diǎn)可以結(jié)合Thinkphp/library/Model.class.php中的delete、save、add操作,參數(shù)為true。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22777.html

相關(guān)文章

  • ThinkPHP 3.2 性能優(yōu)化,實(shí)現(xiàn)高性能API開發(fā)

    摘要:目前的業(yè)務(wù)訪問量數(shù)千萬,后端臺(tái),平均使用率。產(chǎn)生的問題長(zhǎng)連接數(shù)超過時(shí),性能會(huì)下降。很可惜,我們目前使用的青云,目前尚不能實(shí)現(xiàn)超高可用,也不能實(shí)現(xiàn)無縫擴(kuò)容,私網(wǎng)內(nèi)的網(wǎng)絡(luò)傳輸性能延遲都有很大優(yōu)化空間。經(jīng)測(cè)試,性能有的提升。 需求分析 目前的業(yè)務(wù)全站使用ThinkPHP 3.2.3,前臺(tái)、后臺(tái)、Cli、Api等。目前的業(yè)務(wù)API訪問量數(shù)千萬,后端7臺(tái)PHP 5.6,平均CPU使用率20%。 ...

    siberiawolf 評(píng)論0 收藏0
  • 開源:vue2和thinkphp搭建的前后端分離項(xiàng)目

    摘要:大學(xué)生論壇采用和搭建的前后端分離項(xiàng)目地址項(xiàng)目說明本項(xiàng)目為前后端分離項(xiàng)目前端采用全家桶包括搭建,請(qǐng)求采用,組件采用,對(duì)象存儲(chǔ)采用七牛云需要自己配置,實(shí)現(xiàn)客戶端上傳圖片,目前已完成功能用戶登錄注冊(cè)用戶中心基于的富文本發(fā)布。 大學(xué)生論壇 采用vue2和thinkphp搭建的前后端分離項(xiàng)目 github地址:https://github.com/lll618xxx/... showImg(ht...

    Allen 評(píng)論0 收藏0
  • 開源:vue2和thinkphp搭建的前后端分離項(xiàng)目

    摘要:大學(xué)生論壇采用和搭建的前后端分離項(xiàng)目地址項(xiàng)目說明本項(xiàng)目為前后端分離項(xiàng)目前端采用全家桶包括搭建,請(qǐng)求采用,組件采用,對(duì)象存儲(chǔ)采用七牛云需要自己配置,實(shí)現(xiàn)客戶端上傳圖片,目前已完成功能用戶登錄注冊(cè)用戶中心基于的富文本發(fā)布。 大學(xué)生論壇 采用vue2和thinkphp搭建的前后端分離項(xiàng)目 github地址:https://github.com/lll618xxx/... showImg(ht...

    Tikitoo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<