대형 웹사이트의 일반적인 관행은 메모리를 데이터베이스(memcached)로 사용하는 것입니다. 우수한 읽기-쓰기 분리 백업 메커니즘(mysql 마스터-슬레이브)을 사용하면 이러한 환경에서 어떻게 PHP를 개발할 수 있습니까?
$memcached = array( //memcached 다중 프로세스를 사용하여 여러 Memcached 서버를 시뮬레이션합니다. cn en은 메모리 서버 이름입니다.
'cn'=>array(' 192.168.254.144',11211),
'en'=>array('192.168.254.144',11212)
)
$mysql = array( // mysql의 마스터-슬레이브 환경은 다음과 같습니다. : mysql 5 php5의 xp 마스터 리눅스
'master'=>array('192.168.254.213','root','1','mydz'),
'slave_1'=>array(' 192.168.254.144','root','1','mydz') //여러 슬레이브 서버를 유연하게 추가할 수 있습니다
)
?>
서버 구성 파일: 매우 편리합니다. 마스터 슬레이브를 전환하면 슬레이브가 마스터로 빠르게 전환될 수 있습니다.
다음과 같이 코드를 복사하세요.
Memcached
{
private $mem;
public $pflag=''; // memcached pconnect 태그
private function memConnect($serkey){
require 'config.php'; >$server = $memcached;
$this->mem = 새로운 Memcache;
$link = !$this->pflag ? 'connect' : 'pconnect' ; mem->$link($ server[$serkey][0],$server[$serkey][1]) 또는 $this->errordie('memcached 연결 오류')
}
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
}
비공개 함수 태그($ser_key){
$tag=explode('_',$ser_key)
return $tag[0]; 🎜>private function errordie($errmsg ;
Memcached 여러 서버에서. 내 구현 아이디어는 다음과 같습니다. 메모리 서버에 정보를 추가할 때 기존의 자동 할당 기반 대신 해당 서버에 추가하도록 수동으로 설정하기로 선택했습니다.
이는 더 유연할 수 있습니다.
예를 들어 $arr 정보를 en 메모리 서버에 저장하는 것을 나타내기 위해 $mem->set('en_ '.$arr); 이해
다음과 같이 코드를 복사하세요.
class Mysql
{
private $mysqlmaster;
private static $auid= 0;
require 'config.php';
$msg = $mysql;
$this->mysqlmaster = new mysqli($msg[' master'][0],$msg ['master'][1],$msg['master'][2],$msg['master'][3]) //마스터 mysql
if(mysqli_connect_errno()){
printf("연결 실패: %sn",mysqli_connect_error()); >exit();
}
if(!$this->mysqlmaster->set_charset("latin1") && !$this->mysqlslave->set_charset("latin1")){
exit("문자 집합 오류" );
}
}
비공개 함수 autotranscat($mysql){
session_start()
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])
}
공용 함수 mquery( $sql){ //업데이트 삽입
if(!$this->mysqlmaster->query($sql)){
return false
}
}
공개 함수 쿼리; ($sql){
if ($result=$this->mysqlslave->query($sql)){
return $result;
}else{
return false; >};
}
공용 함수 fetArray($sql){
if($result=$this->squery($sql)){
while($row=$result-> ;fetch_array(MYSQLI_ASSOC)){
$resultraa[] = $row;
};
return $resultraa;
}
}
?
mysqli의 패키지입니다. 즉, 슬레이브에서 읽고 마스터에 쓰는 작업을 캡슐화한 것입니다.
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 = "mybb(pid) 값(200)에 삽입"
$mdsql = md5($sql)
if(!$result=$ mem->get('cn_'.$mdsql)){
$sq->mquery("mybb(pid) 값(200)에 삽입") //메인 mysql에 삽입
$result = $sq->fetArray("select * from mybb"); // 쿼리는 mysql
foreach($result as $var){
echo $var['pid']; }
$mem->set('cn_'.$mdsql,$result); //cn이라는 이름의 memcached 서버에 추가
}else{
foreach($result as $var){
echo $var['pid'];
}
}
?>
더 많은 관련 글은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요. )!