이 코드는 유초메 코드를 수정하여 유초메의 효율성을 해결하기 위해 가공한 것입니다.
캡슐화 방법은 비교적 간단하며 읽기 전용 데이터베이스 연결을 위한 인터페이스 확장을 추가하고 읽기 전용 데이터베이스를 사용하지 않아도 원본 코드 사용에 영향을 미치지 않습니다.
앞으로도 지속적으로 개선되어야 할 부분입니다. .
편의를 위해 Google 프로젝트를 설정해 보세요.
http://code.google.com/p/mysql-rw-php/
도움이 필요한 친구에게 도움이 되기를 바랍니다.
PHP로 구현된 Mysql 읽기-쓰기 분리의
주요 기능:
기본 데이터베이스의 간단한 읽기-쓰기 분리, 더 많은 읽기 전용 데이터베이스를 추가할 수 있지만 지원되지 않는 일부 기능에 대해 걱정하지 마십시오. 한 번에 두 개의 데이터베이스를 연결합니다. 동시에 영어가 서툴러서
mysql 읽기/쓰기 분할을 위한 몇 단어 php 코드를
작성합니다.
특징:
단순히 rw 분할
하나의 마스터, 더 많은 노예를 추가할 수 있습니다
모든 mysql 기능 지원
마스터와 슬레이브에 동시에 연결
PHP 코드:
mysql_rw_php.class.php
<?php
/********************************************
*** mysql-rw-php 버전 0.1 @ 2009-4-16
*** 코드: hqlulu#gmail.com
*** http://www.aslibra.com
*** http://code.google.com/p/mysql-rw-php/
*** class_mysql.php(uhome)에서 코드 수정
******************************************/
클래스 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) {
if($pconnect) {
if(!$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로 사용됩니다.
if($this->link_rw == null)
$this->link_rw = $this->링크;
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($db이름) {
$this->select_db($db이름);
}
}
//http://www.knowsky.com/php.asp 읽기 전용 mysql 데이터베이스에 연결
함수 connect_ro($dbhost, $dbuser, $dbpw, $dbname = ”, $pconnect = 0){
if($this->link_rw == null)
$this->link_rw = $this->링크;
$this->링크 = null;
//정지 오류를 생성하지 않음
$this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, false);
if($this->링크){
//연결 성공
//echo "link ro sussess!<br>";
$this->ro_exist = true;
$this->link_ro = $this->링크;
if($this->cur_db){
//이미 데이터베이스를 선택한 경우에는 한 번만 실행해야 합니다.
@mysql_select_db($this->cur_db, $this->link_ro);
}
}또 다른{
//연결 실패
//echo "링크 연결 실패!<br>";
$this->link = &$this->link_rw;
}
}
//일련의 읽기 전용 데이터베이스를 설정하고 그 중 하나에 연결합니다.
함수 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']);
}
}
함수 select_db($dbname) {
//동시에 두 개의 데이터베이스 연결을 작동합니다.
$this->cur_db = $db이름;
if($this->ro_exist){
@mysql_select_db($dbname, $this->link_ro);
}
return @mysql_select_db($dbname, $this->link_rw);
}
함수 fetch_array($query, $result_type = MYSQL_ASSOC) {
return 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;
//문장 선택 여부 결정
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 != '침묵') {
$this->halt('MySQL 쿼리 오류', $sql);
}
$this->querynum++;
$ 쿼리를 반환합니다.
}
함수 영향_행() {
return mysql_affected_rows($this->link);
}
함수 오류() {
return (($this->link) ? mysql_error($this->link) : mysql_error());
}
함수 errno() {
return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());
}
함수 결과($query, $row) {
$query = @mysql_result($query, $row);
$ 쿼리를 반환합니다.
}
함수 num_rows($query) {
$query = mysql_num_rows($query);
$ 쿼리를 반환합니다.
}
함수 num_fields($query) {
return mysql_num_fields($query);
}
함수 free_result($query) {
return 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) {
$query = mysql_fetch_row($query);
$ 쿼리를 반환합니다.
}
함수 fetch_fields($query) {
return mysql_fetch_field($query);
}
함수 버전() {
return mysql_get_server_info($this->link);
}
함수 닫기() {
return mysql_close($this->link);
}
함수 정지($message = ”, $sql = ”) {
$dberror = $this->error();
$dberrno = $this->errno();
echo “<div 스타일=”위치:절대;글꼴 크기:11px;글꼴-가족:verdana,arial;배경:#EBEBEB;패딩:0.5em;”>
<b>MySQL 오류</b><br>
<b>메시지</b>: $message<br>
<b>SQL</b>: $sql<br>
<b>오류</b>: $dberror<br>
<b>오류 번호.</b>: $dberrno<br>
</div>";
출구();
}
}
?>
example.php
<?php
/********************************************
*** mysql-rw-php 버전 0.1 @ 2009-4-16
*** 코드: hqlulu#gmail.com
*** http://www.aslibra.com
*** http://code.google.com/p/mysql-rw-php/
*** class_mysql.php (uhome)에서 코드 수정
******************************************/
require_once('mysql_rw_php.class.php');
//rw 정보
$db_rw = 배열(
'dbhost'=>'www.aslibra.com',
'dbuser'=>'아슬리브라',
'dbpw'=>'www.aslibra.com',
'db이름'=>'테스트'
);
$db_ro = 배열(
정렬(
'dbhost'=>'www.aslibra.com:4306′,
'dbuser'=>'아슬리브라',
'dbpw'=>'www.aslibra.com'
)
);
$DB = 새로운 mysql_rw_php;
//마스터 연결
$DB->connect($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 = "a에서 * 선택";
$qr = $DB->쿼리($sql);
while($row = $DB->fetch_array($qr)){
에코 $행[a];
}
?>