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

資訊專欄INFORMATION COLUMN

thinkphp 下數據庫讀寫分離代碼剖析

sunsmell / 1345人閱讀

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

當采用原生態的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{
                    // 讀操作連接從服務器
                    $r = floor(mt_rand(C("DB_MASTER_NUM"),count($_config["hostname"])-1));   // 每次隨機連接的數據庫
                }
            }
        }else{
            // 讀寫操作不區分服務器
            $r = floor(mt_rand(0,count($_config["hostname"])-1));   // 每次隨機連接的數據庫
        }
        $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方法參數為false,其他刪除、更新、增加讀主庫。這一點可以結合Thinkphp/library/Model.class.php中的delete、save、add操作,參數為true。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22777.html

相關文章

  • ThinkPHP 3.2 性能優化,實現高性能API開發

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

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

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

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

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

    Tikitoo 評論0 收藏0

發表評論

0條評論

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