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

藏色散人
Freigeben: 2020-08-20 13:28:57
nach vorne
3079 Leute haben es durchsucht

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);
    }
Nach dem Login kopieren

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();
        }
    }
Nach dem Login kopieren

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);
    }
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage