memcached+Mysql(主從) php 編程

來源:互聯網
上載者:User

昨天和守住看了下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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.