Home >Backend Development >PHP Tutorial >[Original] PHP development in multiple memcached and mysql master-slave environments: Detailed code explanation_PHP tutorial

[Original] PHP development in multiple memcached and mysql master-slave environments: Detailed code explanation_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 10:38:04805browse

It’s 4 o’clock. Today is the last day in this company. I’m not in a good mood.

So I wrote something to vent. The usual practice for large websites is to use the memory as a database (memcached). And good read and write separation backup mechanism (mysql master-slave)

How can we develop PHP in such an environment. I don’t know much about it. I can talk. So let me post the code.

I just wrote a demo in VIM of linux and passed the debugging. I also hope that everyone will buy it and write it in PHP5. I am afraid that people will say that I am lagging behind if I write it in PHP4

$memcached = array( //Use memcached to simulate multiple processes Taiwanmemcached server cn en is the memory server name
'cn'=>array('192.168.254.144',11211),
'en'=> array('192.168.254.144',11212)
);
$mysql = array( // mysql master-slave my environment 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') //You can flexibly add multiple slave servers
);
?>

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

[php]
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);
}
}
?>
[/php]

Simply encapsulates the operation of memcached. There is not much time for details. I am leaving the company

On multiple servers of memcached. My implementation idea is as follows: When adding information to the memory server, I chose to manually set it to add to that server. Rather than the traditional automatic allocation based on ID.
This can be more flexible.

Expressed by the name of the memory server. For example, to save the information $arr to the memory server en, I will write $mem-> ;set('en_'.$arr); Got it


[php]
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;
  }
}
}
?>
[/php]

这个是 mysqli 的封装.  也就是   读  从  写 主  的操作的封装.

[php] 
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"); //查询 是 从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.bkjia.comtruehttp://www.bkjia.com/PHPjc/735128.htmlTechArticle4点了.今天是最后一天在这间公司.心情不是很好. 所以写下东西发泄下. 一般的大站通常做法是 拿着内存当数据库来用( memcached ). 和很好的读...
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