Home  >  Article  >  Database  >  Detailed explanation of PHP development code in memcached and mysql master-slave environment

Detailed explanation of PHP development code in memcached and mysql master-slave environment

黄舟
黄舟Original
2016-12-14 15:28:57994browse

The usual practice for large websites is to use memory as a database (memcached). With a good read-write separation backup mechanism (mysql master-slave), how can we develop PHP in such an environment?

$memcached = array( //Use memcached multi-process to simulate multiple memcached servers cn en is the name of the memory server
'cn'=>array('192.168.254.144',11211),
' en'=>array('192.168.254.144',11212)
);
$mysql = array( // The master-slave environment of mysql is: xp master linux slave mysql 5 php5
'master'=>array ('192.168.254.213','root','1','mydz'),
'slave_1'=>array('192.168.254.144','root','1','mydz') //Yes Flexibly add multiple slave servers
);
?>

Server configuration file: It is very convenient to switch master and slave. When the master changes the slave, you can quickly switch to the master. Supports multiple slave servers.


Copy the code as follows:
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);
}
}
?>

simply encapsulates the operation of memcached. Not much time for details. I have to leave Company
On a memcached multi-server. My implementation idea is as follows: When adding information to the memory server, I chose to manually set it to add to that server instead of the traditional automatic allocation based on ID.
This works More flexible.
Use the name of the memory server to represent, for example, to save $arr information to the en memory server. I would write $mem->set('en_'.$arr); Got it?

Copy code As follows:
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;
}
}
}
?>

This is an encapsulation of mysqli. It is also an encapsulation of the read-slave-write-master operation.

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)"); //Insert into main mysql
$result = $sq->fetArray("select * from mybb"); //The query is from mysql
foreach($ result as $var){
echo $var['pid'];
}
$mem->set('cn_'.$mdsql,$result); //Add to the memcached server named cn
}else {
foreach($result as $var){
echo $var['pid'];
}
}
?>

For more related articles, please pay attention to the PHP Chinese website (www.php.cn)!


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn