thinkphp Framework Distributed database connection method detailed

Source: Internet
Author: User
Tags dsn explode
This article mainly introduced the thinkphp framework distributed database connection method, combined with the example form detailed analysis thinkphp frame to the Distributed database connection method, the operation skill and the related attention matters, the need friend can refer to the next

This paper analyzes the thinkphp framework distributed database connection method. Share to everyone for your reference, as follows:

Thinkphp as a domestic popular framework, I believe that the use of people must be a minority. In this article, we analyze the more important part of thinkphp-the connection of the distributed database.

Of course, we are not here to use the model to make the database to be used for pruning and checking. We do an analysis of the underlying connection code to help you better understand thinkphp's operations on the database. It is convenient for us to use later.

I. Connection to a single database

When used, the connection configuration of a single database is very simple. We only need to configure the information in the configuration file.

' Db_type ' = ' mysql ', ' db_host ' = ' 192.168.5.102 ', ' db_name ' = ' databasename ', ' db_user ' = ' USER ', ' db_pwd ' = ' password ', ' db_port ' = ' 3306 ', ' db_prefix ' = ' onmpw_ ',

After the setup is complete, you can use it. By default, a single database connection is in progress.

Second, the connection of the distributed database

The connection to a single database is simple, and we focus on the connection of the distributed database.

' Db_type ' = ' mysql ', ' db_host ' = ' 192.168.5.191,192.168.5.88,192.168.5.103 ', ' db_name ' = ' test,test,test ', ' Db_user ' = ' masteruser,slaveuser,slaveuser ', ' db_pwd ' = ' masterpass,slavepass,slavepass ', ' db_port ' and ' = ' 3306 ', ' db_prefix ' = ', ' db_deploy_type ' + 1,//Database deployment method: 0 Centralized (single server), 1 distributed (Master-slave server) ' db_rw_separate ' + true,///database read/write whether separate master-slave effective ' db_master_num ' = 1,//read/write separation of the number of servers ' Db_slave_n O ' = = ',//Specify the number from the server

With the above configuration, you can connect to the distributed database.

Let's look at a few options below

' Db_host '

Distributed database, there are several servers to fill in several server addresses, each address separated by commas. If it is a master-slave distribution, the previous address is the address of the primary database.

For the following user name and password there are listening ports and so on, of course, there are a few to write a few. If the user name and password are the same for each database, you can write only one.

The code for parsing these options is as follows

$_config[' username ' =  explode (', ', $this->config[' username ']); $_config[' password '] =  explode (', ', $ this->config[' password '); $_config[' hostname '] =  explode (', ', $this->config[' hostname '); $_config[' Hostport ']  =  explode (', ', $this->config[' Hostport '); $_config[' database '] =  explode (', ', $this- >config[' database '); $_config[' DSN ']   =  explode (', ', $this->config[' DSN '); $_config[' CharSet ']  =  explode (', ', $this->config[' CharSet '));

' Db_deploy_type ' =>1

The 1 representation is distributed, and 0 represents a centralized (that is, a single server).

The implementation of this option is in the class Think\db\dirver

protected function Initconnect ($master =true) {  if (!empty ($this->config[' deploy '))    //with distributed database    $ This->_linkid = $this->multiconnect ($master);  else    //default single database    if (! $this->_linkid) $this->_linkid = $this->connect ();}

$this->config['deploy']是'DB_DEPLOY_TYPE'This configuration option indicates that the above configuration has been parsed before use, and the configuration items are in the $this->config array. As to how to parse the configuration file, here we do not introduce, interested can refer to the Think\db class.

$this->multiConnect()Functions are used for distributed connections, and if 'DB_DEPLOY_TYPE' the option is set to 1, the function executes. Otherwise, the function is executed directly $this->connect() .

' Db_rw_separate ' =>true

True indicates read-write separation; False indicates that read/write is not separated.

It is important to note that the read-write separation is based on the master-slave database system. This option is set to True when the primary database is written and read from the database.

if ($this->config[' rw_separate ')) {   //master-slave with read-write separation   if ($master)     //Primary server write     $r =  $m;   else{     if (is_numeric ($this->config[' slave_no ')) {//Specify server read       $r = $this->config[' slave_no '];     } else{        //read operation connection from server       $r = Floor (Mt_rand ($this->config[' Master_num '],count ($_config[' hostname '])-1));  Each randomly connected database     }      }}else{   //read-write operation does not differentiate between server   $r = Floor (Mt_rand (0,count ($_config[' hostname '])-1));  Each randomly connected database}

$this->config['rw_separate'] When True, read-write separation is used, and read/write is not separated when false. Why does the read-write separation have to be master-slave? Since the server cannot write to read only, if the data is written to the slave server, the data cannot be synchronized. This can result in inconsistent data. So, if our system is a master-slave, we have to use read-write separation. This means that the Db_rw_separate option must be configured to TRUE.

' Db_master_num ' =>1

The number after this option indicates the number of master servers after read-write separation. Therefore, this option is also used for master-slave database systems.

The following code is to select the primary server.

$m = Floor (Mt_rand (0, $this->config[' Master_num ']-1));

Select the core code to read from the server when the master-slave database reads

Copy the Code code as follows:

$r = Floor (Mt_rand ($this->config[' Master_num '],count ($_config[' hostname '])-1);   Every random connection to the database

Which $this->config['master_num'] represents the number of primary servers.

' Db_slave_no ' and ' = '

Specifies the sequence number from the server that is used to read the data. If not set, the number of books from the server is calculated based on the number of primary servers, and then a random selection is made to read from it.

if (Is_numeric ($this->config[' slave_no ')) {//Specify server read  $r = $this->config[' slave_no '];} else{  //read operation connection from server  $r = Floor (Mt_rand ($this->config[' Master_num '],count ($_config[' hostname '])-1));  Each randomly connected database}

The above is a simple explanation of the implementation code for each option's function.

Let's look at the parts of the connection

if ($m! = $r) {$db _master = array (' username ' = isset ($_config[' username '] [$m])? $_config[' username ' [$m]:$_config['   Username '][0], ' password ' = isset ($_config[' password '] [$m])? $_config[' Password '] [$m]:$_config[' password '][0], ' Hostname ' = isset ($_config[' hostname '] [$m])? $_config[' hostname ' [$m]:$_config[' hostname '][0], ' hostport ' = > isset ($_config[' hostport '] [$m])? $_config[' Hostport ' [$m]:$_config[' Hostport '][0], ' database ' = Isset ($_ config[' database '] [$m])? $_config[' database ' [$m]:$_config[' database '][0], ' DSN ' = isset ($_config[' DSN '] [$m])? $_config[' DSN ' [$m]:$_config[' DSN '][0], ' charset ' = Isset ($_config[' charset ' [$m])? $_config[' CharSet ' [$m]:$_ config[' CharSet '][0],);} $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], ' charset ' = Isset ( $_config[' CharSet '] [$r])? $_config[' CharSet ' [$r]:$_config[' CharSet '][0], return $this->connect ($db _config,$ r, $r = = $m? False: $db _master);

To see this, I think we should be on the above in the introduction of the various configuration options of the code in which the "and $m is what role."

Now let's see $r = = $m? False: $db _master, if the database read and write is not separated, read and write is a server, the value passed to the Connect function is false. Or if it is a master-slave separate write, the value passed to connect is also false. By the above code we see that if "and $m are not equal, the $db_master will be set." In fact, it is equivalent to a standby, if the selected server fails to connect, will connect to $db_master.

The third parameter of the Connect () function actually indicates whether an alternate connection is selected when the $db_config server fails to connect. False means no reconnection, and other values indicate reconnection.

The core code is as follows

try{  if (Empty ($config [' DSN '])) {   $config [' dsn '] =  $this->parsedsn ($config);  }  if (Version_compare (php_version, ' 5.3.6 ', ' <= ')) {    //Disable analog preprocessing statements    $this->options[pdo::attr_emulate_ Prepares] =  false;  }  $this->linkid[$linkNum] = new PDO ($config [' DSN '], $config [' username '], $config [' Password '], $this->options);} catch (\pdoexception $e) {  if ($autoConnection) {//$autoConnection not false, but default primary server    trace ($e GetMessage (), ', ' ERR ');      return $this->connect ($autoConnection, $linkNum); An exception occurred, using a recursive function to reconnect    }elseif ($config [' Debug ']) {      E ($e->getmessage ())}  }

This way, for the master-slave, $r and $m certainly not the same. Therefore, if the selected server fails when it reads the data, the primary server is standby and the master server is eventually read. To ensure the timeliness of data read.

But the overall feeling is not perfect yet. If there are multiple slave servers, the one selected from the server and the primary server fails at the time of reading, then the data is not read failed. It should be more secure if you can read the other slave servers again. Of course, the current thinkphp function has been quite perfect, enough for us to use. But still hope thinkphp more perfect after.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.