รหัสนี้ได้รับการแก้ไขจากรหัส uchome และได้รับการประมวลผลเพื่อแก้ไขประสิทธิภาพของ uchome
วิธีการห่อหุ้มนั้นค่อนข้างง่าย การเพิ่มส่วนขยายอินเทอร์เฟซสำหรับการเชื่อมต่อฐานข้อมูลแบบอ่านอย่างเดียว และการไม่ใช้ฐานข้อมูลแบบอ่านอย่างเดียวจะไม่ส่งผลกระทบต่อการใช้โค้ดต้นฉบับ
ยังคงมีการปรับปรุงอย่างต่อเนื่องในอนาคต -
เพื่อความสะดวก ให้ลองตั้งค่าโครงการ Google:
http://code.google.com/p/mysql-rw-php/
หวังว่าจะช่วยเหลือเพื่อนๆ ที่ต้องการความช่วยเหลือ
คุณสมบัติหลักของการแยกการอ่าน-เขียนของ Mysql ดำเนินการโดย PHP
:
การแยกการอ่าน-การเขียนอย่างง่ายของฐานข้อมูลหลัก คุณสามารถเพิ่มฐานข้อมูลแบบอ่านอย่างเดียวได้มากขึ้น แต่ไม่ต้องกังวลกับคุณสมบัติบางอย่างที่ไม่รองรับ ข้อเสีย: การเชื่อมต่อสองฐานข้อมูลที่ ในเวลาเดียวกันภาษาอังกฤษก็แย่และเขียน
โค้ด php สองสามคำสำหรับการแยกการอ่าน/เขียนของ mysql
คุณสมบัติ:
เพียงแค่แยก rw
เจ้านายหนึ่งคนสามารถเพิ่มทาสได้อีก
รองรับฟีเจอร์ mysql ทั้งหมด
ลิงก์ไปยังมาสเตอร์และทาสในเวลาเดียวกัน
รหัส PHP:
mysql_rw_php.class.php
<?php
-
*** mysql-rw-php เวอร์ชัน 0.1 @ 16-04-2552
*** โค้ดโดย hqlulu#gmail.com
*** http://www.aslibra.com
*** http://code.google.com/p/mysql-rw-php/
*** แก้ไขโค้ดจาก class_mysql.php (uchome)
-
คลาส mysql_rw_php {
//สอบถามเบอร์
var $querynum = 0;
//การเชื่อมต่อฐานข้อมูลสำหรับการดำเนินงานปัจจุบัน
var $link = null;
//ชุดตัวละคร
var $charset;
//ฐานข้อมูลปัจจุบัน
var $cur_db = ";
//ไม่ว่าจะมีการเชื่อมต่อฐานข้อมูลแบบอ่านอย่างเดียวที่ถูกต้องหรือไม่
var $ro_exist = เท็จ;
//การเชื่อมต่อฐานข้อมูลแบบอ่านอย่างเดียว
var $link_ro = null;
//อ่านและเขียนการเชื่อมต่อฐานข้อมูล
var $link_rw = null;
ฟังก์ชั่น mysql_rw_php(){
-
ฟังก์ชั่นเชื่อมต่อ($dbhost, $dbuser, $dbpw, $dbname = ”, $pconnect = 0, $halt = TRUE) {
ถ้า($pconnect) {
ถ้า(!$this->link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) {
$halt && $this->halt('ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ได้');
-
} อื่น {
if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw)) {
$halt && $this->halt('ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ได้');
-
-
//การเชื่อมต่อแบบอ่านอย่างเดียวล้มเหลว
if(!$this->link && !$halt) return false;
//เมื่อไม่ได้เตรียมใช้งาน rw การเชื่อมต่อแรกจะถูกใช้เป็น rw
ถ้า($นี่->link_rw == null)
$this->link_rw = $this->ลิงค์;
ถ้า($นี่->เวอร์ชัน() > '4.1′) {
ถ้า($นี่->ชุดอักขระ) {
@mysql_query("SET character_set_connection=$this->charset, character_set_results=$this->charset, character_set_client=binary", $this->link);
-
ถ้า($นี่->เวอร์ชัน() > '5.0.1′) {
@mysql_query(”SET sql_mode=””, $this->link);
-
-
ถ้า($dbname) {
$this->select_db($dbname);
-
-
//http://www.knowsky.com/php.asp เชื่อมต่อกับฐานข้อมูล mysql แบบอ่านอย่างเดียว
ฟังก์ชั่น Connect_ro($dbhost, $dbuser, $dbpw, $dbname = ”, $pconnect = 0){
ถ้า($นี่->link_rw == null)
$this->link_rw = $this->ลิงค์;
$นี่->ลิงค์ = null;
//อย่าสร้างข้อผิดพลาดในการหยุด
$this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, false);
ถ้า($นี่->ลิงก์){
//การเชื่อมต่อสำเร็จ
//echo “link ro sussess!<br>”;
$นี่->ro_exist = จริง;
$this->link_ro = $this->ลิงค์;
ถ้า($นี่->cur_db){
//หากเลือกฐานข้อมูลแล้ว จะต้องดำเนินการอีกครั้ง
@mysql_select_db($this->cur_db, $this->link_ro);
-
}อื่น{
//การเชื่อมต่อล้มเหลว
//echo “link ro ล้มเหลว!<br>”;
$this->link = &$this->link_rw;
-
-
//ตั้งค่าชุดฐานข้อมูลแบบอ่านอย่างเดียวและเชื่อมต่อกับฐานข้อมูลใดฐานข้อมูลหนึ่ง
ฟังก์ชั่น set_ro_list($ro_list){
ถ้า(is_array($ro_list)){
//สุ่มเลือกอันใดอันหนึ่ง
$link_ro = $ro_list[array_rand($ro_list)];
$this->connect_ro($link_ro['dbhost'], $link_ro['dbuser'], $link_ro['dbpw']);
-
-
ฟังก์ชั่น select_db($dbname) {
//ดำเนินการเชื่อมต่อฐานข้อมูลสองรายการพร้อมกัน
$this->cur_db = $dbname;
ถ้า($นี่->ro_exist){
@mysql_select_db($dbname, $this->link_ro);
-
return @mysql_select_db($dbname, $this->link_rw);
-
ฟังก์ชั่น fetch_array($query, $result_type = MYSQL_ASSOC) {
กลับ mysql_fetch_array($query, $result_type);
-
ฟังก์ชั่น fetch_one_array($sql, $type = ”) {
$qr = $this->query($sql, $type);
ส่งคืน $this->fetch_array($qr);
-
แบบสอบถามฟังก์ชัน($sql, $type = ”) {
$this->link = &$this->link_rw;
//พิจารณาว่าจะเลือกคำสั่งหรือไม่
ถ้า($this->ro_exist && preg_match ("/^(s*)select/i", $sql)){
$this->link = &$this->link_ro;
-
$func = $type == 'ไม่มีบัฟเฟอร์' && @function_exists('mysql_unbuffered_query') ?
'mysql_unbuffered_query' : 'mysql_query';
if(!($query = $func($sql, $this->link)) && $type != 'เงียบ') {
$this->halt('MySQL Query Error', $sql);
-
$นี่->แบบสอบถาม++;
ส่งคืน $ แบบสอบถาม;
-
ฟังก์ชั่นที่ได้รับผลกระทบ_แถว () {
ส่งคืน mysql_affected_rows($this->link);
-
ฟังก์ชั่นผิดพลาด () {
return (($this->link) ? mysql_error($this->link) : mysql_error());
-
ฟังก์ชั่น errno() {
กลับ intval(($this->link) ? mysql_errno($this->link) : mysql_errno());
-
ผลลัพธ์ของฟังก์ชัน($แบบสอบถาม, $แถว) {
$query = @mysql_result($query, $row);
ส่งคืน $ แบบสอบถาม;
-
ฟังก์ชั่น num_rows($แบบสอบถาม) {
$query = mysql_num_rows($query);
ส่งคืน $ แบบสอบถาม;
-
ฟังก์ชั่น num_fields($แบบสอบถาม) {
ส่งคืน mysql_num_fields($query);
-
ฟังก์ชั่น free_result ($ แบบสอบถาม) {
ส่งคืน mysql_free_result($query);
-
ฟังก์ชั่น insert_id() {
return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT Last_insert_id()"), 0);
-
ฟังก์ชั่น fetch_row($แบบสอบถาม) {
$query = mysql_fetch_row($query);
ส่งคืน $ แบบสอบถาม;
-
ฟังก์ชั่น fetch_fields($ แบบสอบถาม) {
ส่งคืน mysql_fetch_field($query);
-
เวอร์ชันฟังก์ชัน () {
ส่งคืน mysql_get_server_info($this->link);
-
ฟังก์ชั่นปิด () {
กลับ mysql_close($this->link);
-
ฟังก์ชั่นหยุด($message = ”, $sql = ”) {
$dberror = $this->error();
$dberrno = $this->errno();
echo “<div style=”position:absolute;font-size:11px;font-family:verdana,arial;พื้นหลัง:#EBEBEB;padding:0.5em;”>
<b>ข้อผิดพลาด MySQL</b><br>
<b>ข้อความ</b>: $ข้อความ<br>
<b>SQL</b>: $sql<br>
<b>ข้อผิดพลาด</b>: $dberror<br>
<b>ผิดพลาดประการใด</b>: $dberrno<br>
</div>";
ออก();
-
-
-
ตัวอย่าง.php
<?php
-
*** mysql-rw-php เวอร์ชัน 0.1 @ 16-04-2552
*** โค้ดโดย hqlulu#gmail.com
*** http://www.aslibra.com
*** http://code.google.com/p/mysql-rw-php/
*** แก้ไขโค้ดจาก class_mysql.php (uchome)
-
need_once('mysql_rw_php.class.php');
//ข้อมูล rw
$db_rw = อาร์เรย์(
'dbhost'=>'www.aslibra.com',
'dbuser'=>'aslibra',
'dbpw'=>'www.aslibra.com',
'dbname'=>'ทดสอบ'
-
$db_ro = อาร์เรย์(
อาร์เรย์(
'dbhost'=>'www.aslibra.com:4306′,
'dbuser'=>'aslibra',
'dbpw'=>'www.aslibra.com'
-
-
$DB = mysql_rw_php ใหม่;
//เชื่อมต่อมาสเตอร์
$DB->เชื่อมต่อ($db_rw[dbhost], $db_rw[dbuser], $db_rw[dbpw], $db_rw[dbname]);
// วิธีที่ 1: เชื่อมต่อเซิร์ฟเวอร์เดียว
$DB->connect_ro($db_ro[0][dbhost], $db_ro[0][dbuser], $db_ro[0][dbpw]);
//วิธีที่ 2: เชื่อมต่อเซิร์ฟเวอร์หนึ่งเครื่องจากรายการตาม rand
$DB->set_ro_list($db_ro);
//ส่งไปที่ rw
$sql = "ใส่เข้าไปในชุด a='test'";
$DB->แบบสอบถาม($sql);
//ส่งไปที่ro
$sql = "เลือก * จาก";
$qr = $DB->แบบสอบถาม($sql);
ในขณะที่($row = $DB->fetch_array($qr)){
เสียงสะท้อน $แถว[a];
-
-