昨天和守住看了下http://hi.baidu.com/156544632/blog/item/3b26527b68623ff00bd18746.html這篇文章,思路很好,但感覺就是太亂了,
而且還出現了一點錯誤,可能這位仁兄時間比較緊吧,所以考略不是很全面,今天我在這裡重新整理了一下,並且做了相應的實驗,拿出來
供大家一起學習下。
/*
index.php 程式入口,用來構造sql(如查詢,更新)
config.php 配置參數(memcache,mysql)
init.php 封裝memcached操作(memcache串連,設定,擷取)
mysqli.php 封閉mysql操作(mysql主串連,mysql從串連,mysql主更新,mysql從查詢)
*/
index.php
<?php
require 'init.php'; //載入init.php
$mem = new Memcached; //建立memcached對象,對象為$mem
/*
$mem->set('en_xx','bucuo',0,30); //測試連接memcached,用來調試很不錯。
echo($mem->get('en_xx'));
$mem->set('cn_jjyy','wokao',0,30);
echo($mem->get('cn_jjyy'));
*/
require 'mysqli.php';
$sq = new Mysql;
//下面這兩個sql是人為構造的,這也可以做成一個介面
$sql = "Select * from traffic";
//$sql = "insert into traffic(id,acct_mth,amount) values(14,14,46)";
//進行判斷,如果sql語句中有頭有select(不區分大小寫)
if(preg_match ("/^select/i", $sql)){
$mdsql = md5($sql);
if(!$result=$mem->get('cn_'.$mdsql)){ //這裡選擇的是cn memcached,大家也可以根據需求在前面做個條件來將資料存取放入到另一個memcached中。
$result = $sq->fetArray($sql); //查詢是 從mysql
foreach($result as $var){
echo $var['amount'];
}
$mem->set('cn_'.$mdsql,$result,0,600); //添加到 名為cn的memcached 伺服器
}else{
foreach($result as $var){
echo $var['amount']."<br>";
}
}
}else{
$sq->mquery($sql); //更新是 主mysql
}
?>
config.php
<?php
$memcached = array(
'cn'=>array('192.168.x.y',11211),
'en'=>array('192.168.y.x',11211)
);
$mysql = array(
'master'=>array('x','root','','test'),
'slave_1'=>array('y','root','','test'),
'slave_2'=>array('z','root','','test') //可以靈活添加多台從伺服器
);
?>
init.php
<?php
class Memcached
{
private $mem;
public $pflag=''; // memcached pconnect tag
private function memConnect($serkey){ //建立memcached串連,這些都很容易理解
require 'config.php';
$server = $memcached; //$memcached是cn,en的數組
$this->mem = new Memcache;
$link = !$this->pflag ? 'connect' : 'pconnect' ;
$this->mem->$link($server[$serkey][0],$server[$serkey][1]) or $this->errordie('memcached connect error');
}
public function set($ser_key,$values,$flag='',$expire=''){ //設定擷取資料
$this->memConnect($this->tag($ser_key));
if($this->mem->set($ser_key,$values,$flag,$expire)) return true;
else return false;
}
public function get($ser_key){
$this->memConnect($this->tag($ser_key));
if($var=$this->mem->get($ser_key)) return $var;
else return false;
}
private function tag($ser_key){
$tag=explode('_',$ser_key);
return $tag[0];
}
private function errordie($errmsg){
die($errmsg);
}
/* 這段函數是我用來在類中做調試用的。
public function show($messages){
echo $messages;
}
*/
}
?>
mysqli.php
<?php
class Mysql
{
/* 這段函數是我用來調試的
public function show($messages){
var_dump($messages);
}
*/
private $mysqlmaster;
private $myssqlslave;
public function __construct(){ //建構函式
require 'config.php';
$msg = $mysql; //$mysql是master,slave_1,slave_2
$this->mysqlmaster = new mysqli($msg['master'][0],$msg['master'][1],$msg['master'][2],$msg['master'][3]); //master mysql
$this->mysqlslave = $this->autotranscat($msg); // slave mysql
if(mysqli_connect_errno()){
printf("Connect failed: %s\n",mysqli_connect_error());
exit();
}
if(!$this->mysqlmaster->set_charset("latin1") && !$this->mysqlslave->set_charset("latin1")){
exit("set charset error");
}
}
private function autotranscat($mysql){ //這段函數的作用是擷取從伺服器序號,如1,2
session_start(); //啟動會話
$_SESSION['SID']!=0 || $_SESSION['SID']=0; //如果不為0,就不做賦值操作(那第一次訪問的話,肯定會做賦值操作的)
if($_SESSION['SID'] >=count($mysql)-1) $_SESSION['SID'] = 1; //上面那個動作是為這個動作準備的
else $_SESSION['SID']++;
$key = 'slave_'.$_SESSION['SID'];
return new mysqli($mysql[$key][0],$mysql[$key][1],$mysql[$key][2],$mysql[$key][3]);
}
public function mquery($sql){ //mysql主 insert update
if(!$this->mysqlmaster->query($sql)){
return false;
}
}
public function squery($sql){ //mysql從 查詢
if($result=$this->mysqlslave->query($sql)){
return $result;
}else{
return false;
};
}
public function fetArray($sql){ //mysql從 查詢 入口
if($result=$this->squery($sql)){
while($row=$result->fetch_array(MYSQLI_ASSOC)){
$resultraa[] = $row;
};
return $resultraa;
}
}
}
?>
這樣就完成了,我畫的那幅圖了,看懂了嗎?
本文出自 “壞男孩” 部落格,請務必保留此出處http