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

墨辰丷
Freigeben: 2023-03-27 17:46:02
Original
1419 Leute haben es durchsucht

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

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

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!

Verwandte Etiketten:
Quelle:php.cn
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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!