Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Lese- und Schreibtrennung der MySQL-Datenbank unter thinkphp

Detaillierte Erläuterung der Lese- und Schreibtrennung der MySQL-Datenbank unter thinkphp

墨辰丷
墨辰丷Original
2018-05-23 17:13:401462Durchsuche

Dieser Artikel stellt hauptsächlich die Analyse des Lese-/Schreib-Trenncodes der MySQL-Datenbank vor. Interessierte Freunde können darauf verweisen.

Wenn Sie die ursprüngliche SQL-Anweisung für Schreibvorgänge verwenden, wird „Execute“ verwendet, und „Query“ wird für Lesevorgänge verwendet.

Die MySQL-Daten-Master-Slave-Synchronisation basiert immer noch auf dem MySQL-Mechanismus, daher muss das Verzögerungsproblem der MySQL-Master-Slave-Synchronisation zu diesem Zeitpunkt optimiert werden. Wenn die Verzögerungszeit zu lang ist, ist dies nicht der Fall wirkt sich nur auf das Geschäft aus, sondern wirkt sich auch auf die Benutzererfahrung aus.

In der thinkphp-Kernklasse Thinkphp/library/Model.class.php ruft die Abfragemethode Thinkphp/library/Think/Db/Driver/Mysql.class.php auf

  /**
   * 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);
  }

Call 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 Codeimplementierung. 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, Lese-Master-Bibliothek hinzufügen. 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 gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich sein wird.


Verwandte Empfehlungen:

PHPAnalyse der Methode der Funktion shuffle(), um mehrere zufällige Elemente aus einem zu entnehmen array_php-Kenntnisse

PHPVerwenden Sie stream_context_create(), um POST/GET-Requests zu simulieren._php-Tipps

PHPSo konvertieren Sie XML in ein Array_php-Tipps

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Lese- und Schreibtrennung der MySQL-Datenbank unter thinkphp. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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