PHP实现的Mysql读写分离
主要特性:
简单的读写分离
一个主数据库,可以添加更多的只读数据库
读写分离但不用担心某些特性不支持
缺点:同时连接两个数据库
英文比较烂,也写几个字吧
php code for mysql read/write split feature: simply rw split one master,can add more slaves support all mysql feature link to the master and slave at the same time
mysql_rw_php.class.php
<?php /**************************************** *** mysql-rw-php version 0.1 @ 2009-4-16 *** code by hqlulu#gmail.com *** http://www.aslibra.com *** http://code.google.com/p/mysql-rw-php/ *** code modify from class_mysql.php (uchome) ****************************************/ class mysql_rw_php { //查询个数 var $querynum = 0; //当前操作的数据库连接 var $link = null; //字符集 var $charset; //当前数据库 var $cur_db = ''; //是否存在有效的只读数据库连接 var $ro_exist = false; //只读数据库连接 var $link_ro = null; //读写数据库连接 var $link_rw = null; function mysql_rw_php(){ } function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0, $halt = TRUE) { if($pconnect) { if(!$this->link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) { $halt && $this->halt('Can not connect to MySQL server'); } } else { if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw)) { $halt && $this->halt('Can not connect to MySQL server'); } } //只读连接失败 if(!$this->link && !$halt) return false; //未初始化rw时,第一个连接作为rw if($this->link_rw == null) $this->link_rw = $this->link; if($this->version() > '4.1') { if($this->charset) { @mysql_query("SET character_set_connection=$this->charset, character_set_results=$this->charset, character_set_client=binary", $this->link); } if($this->version() > '5.0.1') { @mysql_query("SET sql_mode=''", $this->link); } } if($dbname) { $this->select_db($dbname); } } //连接一个只读的mysql数据库 function connect_ro($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0){ if($this->link_rw == null) $this->link_rw = $this->link; $this->link = null; //不产生halt错误 $this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, false); if($this->link){ //连接成功 //echo "link ro sussess!<br>"; $this->ro_exist = true; $this->link_ro = $this->link; if($this->cur_db){ //如果已经选择过数据库则需要操作一次 @mysql_select_db($this->cur_db, $this->link_ro); } }else{ //连接失败 //echo "link ro failed!<br>"; $this->link = &$this->link_rw; } } //设置一系列只读数据库并且连接其中一个 function set_ro_list($ro_list){ if(is_array($ro_list)){ //随机选择其中一个 $link_ro = $ro_list[array_rand($ro_list)]; $this->connect_ro($link_ro['dbhost'], $link_ro['dbuser'], $link_ro['dbpw']); } } function select_db($dbname) { //同时操作两个数据库连接 $this->cur_db = $dbname; if($this->ro_exist){ @mysql_select_db($dbname, $this->link_ro); } return @mysql_select_db($dbname, $this->link_rw); } function fetch_array($query, $result_type = MYSQL_ASSOC) { return mysql_fetch_array($query, $result_type); } function fetch_one_array($sql, $type = '') { $qr = $this->query($sql, $type); return $this->fetch_array($qr); } function query($sql, $type = '') { $this->link = &$this->link_rw; //判断是否select语句 if($this->ro_exist && preg_match ("/^(\s*)select/i", $sql)){ $this->link = &$this->link_ro; } $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ? 'mysql_unbuffered_query' : 'mysql_query'; if(!($query = $func($sql, $this->link)) && $type != 'SILENT') { $this->halt('MySQL Query Error', $sql); } $this->querynum++; return $query; } function affected_rows() { return mysql_affected_rows($this->link); } function error() { return (($this->link) ? mysql_error($this->link) : mysql_error()); } function errno() { return intval(($this->link) ? mysql_errno($this->link) : mysql_errno()); } function result($query, $row) { $query = @mysql_result($query, $row); return $query; } function num_rows($query) { $query = mysql_num_rows($query); return $query; } function num_fields($query) { return mysql_num_fields($query); } function free_result($query) { return mysql_free_result($query); } function insert_id() { return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0); } function fetch_row($query) { $query = mysql_fetch_row($query); return $query; } function fetch_fields($query) { return mysql_fetch_field($query); } function version() { return mysql_get_server_info($this->link); } function close() { return mysql_close($this->link); } function halt($message = '', $sql = '') { $dberror = $this->error(); $dberrno = $this->errno(); echo "<div style=\"position:absolute;font-size:11px;font-family:verdana,arial;background:#EBEBEB; padding:0.5em;\"> <b>MySQL Error</b><br> <b>Message</b>: $message<br> <b>SQL</b>: $sql<br> <b>Error</b>: $dberror<br> <b>Errno.</b>: $dberrno<br> </div>"; exit(); } } ?>
example.php
<?php /**************************************** *** mysql-rw-php version 0.1 @ 2009-4-16 *** code by hqlulu#gmail.com *** http://www.aslibra.com *** http://code.google.com/p/mysql-rw-php/ *** code modify from class_mysql.php (uchome) ****************************************/ require_once('mysql_rw_php.class.php'); //rw info $db_rw = array( 'dbhost'=>'www.aslibra.com', 'dbuser'=>'aslibra', 'dbpw'=>'www.aslibra.com', 'dbname'=>'test' ); $db_ro = array( array( 'dbhost'=>'www.aslibra.com:4306', 'dbuser'=>'aslibra', 'dbpw'=>'www.aslibra.com' ) ); $DB = new mysql_rw_php; //connect Master $DB->connect($db_rw[dbhost], $db_rw[dbuser], $db_rw[dbpw], $db_rw[dbname]); //Method 1: connect one server $DB->connect_ro($db_ro[0][dbhost], $db_ro[0][dbuser], $db_ro[0][dbpw]); //Method 2: connect one server from a list by rand $DB->set_ro_list($db_ro); //send to rw $sql = "insert into a set a='test'"; $DB->query($sql); //send to ro $sql = "select * from a"; $qr = $DB->query($sql); while($row = $DB->fetch_array($qr)){ echo $row[a]; } ?>
以上就是PHP实现的Mysql读写分离的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











MySQL dan phpmyadmin adalah alat pengurusan pangkalan data yang kuat. 1) MySQL digunakan untuk membuat pangkalan data dan jadual, dan untuk melaksanakan pertanyaan DML dan SQL. 2) Phpmyadmin menyediakan antara muka intuitif untuk pengurusan pangkalan data, pengurusan struktur meja, operasi data dan pengurusan kebenaran pengguna.

IIS dan PHP serasi dan dilaksanakan melalui FastCGI. 1.IIS meneruskan permintaan fail .php ke modul FastCGI melalui fail konfigurasi. 2. Modul FastCGI memulakan proses PHP untuk memproses permintaan untuk meningkatkan prestasi dan kestabilan. 3. Dalam aplikasi sebenar, anda perlu memberi perhatian kepada butiran konfigurasi, debugging ralat dan pengoptimuman prestasi.

Di MySQL, fungsi kunci asing adalah untuk mewujudkan hubungan antara jadual dan memastikan konsistensi dan integriti data. Kekunci asing mengekalkan keberkesanan data melalui pemeriksaan integriti rujukan dan operasi cascading. Perhatikan pengoptimuman prestasi dan elakkan kesilapan biasa apabila menggunakannya.

Perbezaan utama antara MySQL dan MariaDB adalah prestasi, fungsi dan lesen: 1. MySQL dibangunkan oleh Oracle, dan Mariadb adalah garpu. 2. MariaDB boleh melakukan lebih baik dalam persekitaran beban tinggi. 3.MariADB menyediakan lebih banyak enjin dan fungsi penyimpanan. 4.MYSQL mengamalkan lesen dua, dan MariaDB adalah sumber terbuka sepenuhnya. Infrastruktur yang sedia ada, keperluan prestasi, keperluan fungsional dan kos lesen perlu diambil kira apabila memilih.

SQL adalah bahasa standard untuk menguruskan pangkalan data relasi, manakala MySQL adalah sistem pengurusan pangkalan data yang menggunakan SQL. SQL mentakrifkan cara untuk berinteraksi dengan pangkalan data, termasuk operasi CRUD, sementara MySQL melaksanakan standard SQL dan menyediakan ciri -ciri tambahan seperti prosedur dan pencetus yang disimpan.

MySQL sesuai untuk pembangunan pesat dan aplikasi kecil dan sederhana, sementara Oracle sesuai untuk perusahaan besar dan keperluan ketersediaan yang tinggi. 1) MySQL adalah sumber terbuka dan mudah digunakan, sesuai untuk aplikasi web dan perusahaan kecil dan sederhana. 2) Oracle berkuasa dan sesuai untuk perusahaan besar dan agensi kerajaan. 3) MySQL menyokong pelbagai enjin penyimpanan, dan Oracle menyediakan fungsi peringkat perusahaan yang kaya.

Pelbagai panggilan ke session_start () akan menghasilkan mesej amaran dan kemungkinan penggantian data. 1) PHP akan mengeluarkan amaran, menyebabkan sesi telah dimulakan. 2) Ia boleh menyebabkan penggantian data sesi yang tidak dijangka. 3) Gunakan session_status () untuk memeriksa status sesi untuk mengelakkan panggilan berulang.

MySQL dan phpmyadmin boleh diuruskan dengan berkesan melalui langkah -langkah berikut: 1. Buat dan hapus pangkalan data: hanya klik phpmyadmin untuk diselesaikan. 2. Mengurus Jadual: Anda boleh membuat jadual, mengubahsuai struktur, dan menambah indeks. 3. Operasi Data: Menyokong memasukkan, mengemas kini, memadam data dan melaksanakan pertanyaan SQL. 4. Data Import dan Eksport: Menyokong SQL, CSV, XML dan format lain. 5. Pengoptimuman dan Pemantauan: Gunakan arahan yang boleh dioptimumkan untuk mengoptimumkan jadual dan gunakan penganalisis pertanyaan dan alat pemantauan untuk menyelesaikan masalah prestasi.
