国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

sunsmell / 1357人閱讀

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

當采用原生態(tài)的sql語句進行寫入操作的時候,要用execute,讀操作要用query。

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

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í)行查詢 返回數(shù)據(jù)集
     * @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;
        //釋放前次的查詢結(jié)果
        if ( $this->queryID ) {    $this->free();    }
        N("db_query",1);
        // 記錄開始執(zhí)行時間
        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ù)庫鏈接時,initConnect(false),調(diào)用Thinkphp/library/Think/Db/Db.class.php,注意false、true代碼實現(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
            // 默認單數(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));   // 每次隨機連接的數(shù)據(jù)庫
                }
            }
        }else{
            // 讀寫操作不區(qū)分服務(wù)器
            $r = floor(mt_rand(0,count($_config["hostname"])-1));   // 每次隨機連接的數(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,其他刪除、更新、增加讀主庫。這一點可以結(jié)合Thinkphp/library/Model.class.php中的delete、save、add操作,參數(shù)為true。

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22777.html

相關(guān)文章

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

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

    siberiawolf 評論0 收藏0
  • 開源:vue2和thinkphp搭建的前后端分離項目

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

    Allen 評論0 收藏0
  • 開源:vue2和thinkphp搭建的前后端分離項目

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

    Tikitoo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<