memcached 和 mysql 主從環(huán)境下php開(kāi)發(fā)代碼詳解

一般的大站通常做法是 拿著內(nèi)存當(dāng)數(shù)據(jù)庫(kù)來(lái)用(memcached). 和很好的讀 寫(xiě)分離 備份機(jī)制 (mysql 的主從) 在這樣的環(huán)境下我們?cè)趺催M(jìn)行php開(kāi)發(fā)呢。

$memcached = array( //用memcached 的 多 進(jìn)程模擬 多臺(tái)memcached 服務(wù)器 cn en 為 內(nèi)存服務(wù)器名?
‘cn’=>array(‘192.168.254.144’,11211),?
‘en’=>array(‘192.168.254.144’,11212)?
);?
$mysql = array( // mysql 的主從 我的環(huán)境是 : xp 主 linux 從 mysql 5 php5?
‘master’=>array(‘192.168.254.213′,’root’,’1′,’mydz’),?
‘slave_1’=>array(‘192.168.254.144′,’root’,’1′,’mydz’) //可以靈活添加多臺(tái)從服務(wù)器?
);?
?>

服務(wù)器配置文件: 十分方便的 切換主從. 當(dāng)主換了 從可以迅速切換為主. 支持 多從服務(wù)器 .

復(fù)制代碼 代碼如下:
class Memcached?
{?
private $mem;?
public $pflag=”; // memcached pconnect tag?
private function memConnect($serkey){?
require ‘config.php’;?
$server = $memcached;?
$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);?
}?
}?
?>

簡(jiǎn)單的封裝了 memcached 的操作. 詳細(xì)的時(shí)間不多.我要離開(kāi)公司了?
在memcached 的多服務(wù)器上. 我的實(shí)現(xiàn)思路是這樣的: 在把信息添加到 內(nèi)存服務(wù)器的時(shí)候.我選擇了手工設(shè)置添加到那個(gè)服務(wù)器.而不用傳統(tǒng)的根據(jù)ID自動(dòng)分配.?
這樣可以更靈活點(diǎn).?
以?xún)?nèi)存服務(wù)器名 為表示 比如 存 $arr 這個(gè)信息到 en 這臺(tái) 內(nèi)存服務(wù)器 我就這樣寫(xiě) $mem->set(‘en_’.$arr); 明白了吧

立即學(xué)習(xí)PHP免費(fèi)學(xué)習(xí)筆記(深入)”;

復(fù)制代碼 代碼如下:
class Mysql?
{?
private $mysqlmaster;?
private $myssqlslave;?
private static $auid=0;?
public function __construct(){?
require ‘config.php’;?
$msg = $mysql;

$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: %sn”,mysqli_connect_error());?
exit();?
}?
if(!$this->mysqlmaster->set_charset(“latin1”) && !$this->mysqlslave->set_charset(“latin1”)){?
exit(“set charset error”);?
}?
}?
private function autotranscat($mysql){?
session_start();?
$_SESSION[‘SID’]!=0 || $_SESSION[‘SID’]=0 ;?
if($_SESSION[‘SID’] >=count($mysql)-1) $_SESSION[‘SID’] = 1;?
else $_SESSION[‘SID’]++;?
$key = ‘slave_’.$_SESSION[‘SID’];?
echo($_SESSION[‘SID’]);?
return new mysqli($mysql[$key][0],$mysql[$key][1],$mysql[$key][2],$mysql[$key][3]);?
}?
public function mquery($sql){ //insert update?
if(!$this->mysqlmaster->query($sql)){?
return false;?
}?
}?
public function squery($sql){?
if($result=$this->mysqlslave->query($sql)){?
return $result;?
}else{?
return false;?
};?
}?
public function fetArray($sql){?
if($result=$this->squery($sql)){?
while($row=$result->fetch_array(MYSQLI_ASSOC)){?
$resultraa[] = $row;?
};?
return $resultraa;?
}?
}?
}?
?>

這個(gè)是 mysqli 的封裝. 也就是 讀 從 寫(xiě) 主 的操作的封裝.

require ‘init.php’;?
$mem = new Memcached;?
/* $mem->set(‘en_xx’,’bucuo’);?
echo($mem->get(‘en_xx’));?
$mem->set(‘cn_jjyy’,’wokao’);?
echo($mem->get(‘cn_jjyy’));?
*/?
$sq = new Mysql;?
$sql = “insert into mybb(pid) values(200)”;?
$mdsql = md5($sql);?
if(!$result=$mem->get(‘cn_’.$mdsql)){?
$sq->mquery(“insert into mybb(pid) values(200)”); //插入到主mysql?
$result = $sq->fetArray(“select * from mybb”); //查詢(xún) 是 從mysql?
foreach($result as $var){?
echo $var[‘pid’];?
}?
$mem->set(‘cn_’.$mdsql,$result); //添加到 名為 cn 的 memcached 服務(wù)器?
}else{?
foreach($result as $var){?
echo $var[‘pid’];?
}?
}?
?>

?更多相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!?

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享