Heim  >  Artikel  >  PHP-Framework  >  Analyse des Lesens und Schreibens von Trennungscode in der Datenbank unter thinkphp

Analyse des Lesens und Schreibens von Trennungscode in der Datenbank unter thinkphp

藏色散人
藏色散人nach vorne
2020-08-20 13:28:573066Durchsuche

Die folgende Spalte des thinkphpFramework-Tutorials stellt Ihnen die Codeanalyse der Lese- und Schreibtrennung von Datenbanken unter thinkphp vor. Ich hoffe, dass sie Freunden in Not hilfreich sein wird!

Analyse des Lesens und Schreibens von Trennungscode in der Datenbank unter thinkphp

  • Bei Verwendung der ursprünglichen SQL-Anweisung für Schreibvorgänge wird „Execute“ und für Lesevorgänge „Query“ verwendet.

  • Die Master-Slave-Synchronisierung von MySQL-Daten basiert immer noch auf dem MySQL-Mechanismus, sodass das Verzögerungsproblem der MySQL-Master-Slave-Synchronisierung zu diesem Zeitpunkt nicht nur Auswirkungen auf das Geschäft hat, sondern auch Auswirkungen hat die Benutzererfahrung.

Thinkphp-Kernklasse Thinkphp/library/Model.class.php, Abfragemethode,

Aufruf von 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);
    }

Aufruf von 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();
        }
    }

Wenn Sie den obigen Datenbanklink initialisieren, ruft initConnect(false) Thinkphp/library/Think/Db/Db.class.php auf. Achten Sie auf die falsche und wahre Code-Implementierung. true bedeutet, dass die Hauptbibliothek direkt aufgerufen wird, false bedeutet, dass die Lesebibliothek mit separatem Lesen und Schreiben aufgerufen wird.

  /**
     * 初始化数据库连接
     * @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);
    }

Abfragemethodenparameter ist falsch, andere löschen, aktualisieren und fügen die Hauptlesebibliothek hinzu. Dies kann mit den Vorgängen „Löschen“, „Speichern“ und „Hinzufügen“ in Thinkphp/library/Model.class.php kombiniert werden, und der Parameter ist wahr.

Das obige ist der detaillierte Inhalt vonAnalyse des Lesens und Schreibens von Trennungscode in der Datenbank unter thinkphp. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen