天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

深入Memcache的Session數(shù)據(jù)的多服務(wù)器共享詳解

一相關(guān)介紹
1.memcache + memcache的多服務(wù)器數(shù)據(jù)共享的介紹
,請(qǐng)參見(jiàn)http://www.guigui8.com/index.php/archives/206.html
2.session機(jī)制:
session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息。
當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session的時(shí)候,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)session標(biāo)識(shí)- 稱為sessionid,如果已包含一個(gè)sessionid則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過(guò)session,服務(wù)器就按照sessionid把這個(gè)session檢索出來(lái)使用(如果檢索不到,可能會(huì)新建一個(gè)),如果客戶端請(qǐng)求不包含sessionid,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的sessionid,sessionid的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè)sessionid將被在本次響應(yīng)中返回給客戶端保存。

保存這個(gè)sessionid的方式可以采用cookie,這樣在交互過(guò)程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)揮給服務(wù)器

一般這個(gè)cookie的名字都是類似于SEEESIONID,而。比如weblogic對(duì)于web應(yīng)用程序生成的cookie,phpSESSID=ByOK3vjFD75aPnrF3K2HmdnV6QZcEbzWoWiBYEnLerj,它的名字就是phpSESSID。

二動(dòng)機(jī)
在實(shí)際web生產(chǎn)環(huán)境中,一個(gè)應(yīng)用系統(tǒng),往往將不同的業(yè)務(wù)應(yīng)用分布到不同服務(wù)器上進(jìn)行處理。
當(dāng)跟蹤當(dāng)前在線用戶信息時(shí),如果是同一個(gè)主域名時(shí),可以用全域cookie處理相關(guān)數(shù)據(jù)的共享問(wèn)題;如果是在不同主域下,則可以通過(guò)觀察者模式的中心話概念解決相應(yīng)問(wèn)題,通過(guò)這種概念延伸出的解決方案有很多,而今天我所要講的,是前一種,通過(guò)memcache的多服務(wù)器數(shù)據(jù)共享技術(shù)來(lái)模擬session,以進(jìn)行對(duì)當(dāng)前在線用戶數(shù)據(jù)的多服務(wù)器共享。
關(guān)于多服務(wù)器統(tǒng)一session信息,要求如下:
1.能夠在memcached規(guī)定的幾臺(tái)服務(wù)器上,保存session信息(通過(guò)前面介紹的memcache的多服務(wù)器數(shù)據(jù)共享);
2.能夠象zend定義的session_start()前,通過(guò)session_id($sessid)那樣,自定義session_id的值。
3.能方便的在系統(tǒng)運(yùn)行時(shí),切換memcached存儲(chǔ)的session信息和 用文件存儲(chǔ)的session信息的操作。

三代碼
實(shí)現(xiàn)方式很簡(jiǎn)單,通過(guò)memcache來(lái)模擬session機(jī)制,只是利用memcache將存儲(chǔ)媒介換成共享服務(wù)器的內(nèi)存,以達(dá)到多臺(tái)分布式部署的服務(wù)器共享session信息的目的。而調(diào)用的接口,與zend提供的session操作函數(shù)相區(qū)別,所以可以方便的在memcache和文件的session信息操作建切換。
以下代碼,已經(jīng)過(guò)多次實(shí)際測(cè)試,能達(dá)到以上功能需求。先貼下面了:
復(fù)制代碼 代碼如下:
/**
 *=---------------------------------------------------------------------------=
 *                         MemcacheSession.class.php
 *=---------------------------------------------------------------------------=
 *
 * 實(shí)現(xiàn)基于Memcache存儲(chǔ)的 Session 功能
 *  (模擬session機(jī)制,只是利用memcache將存儲(chǔ)媒介換成共享服務(wù)器的內(nèi)存)
 *
 * 缺點(diǎn):暫時(shí)沒(méi)有引入不同主域的session共享機(jī)制的實(shí)現(xiàn)策略。即只支持同主域下的實(shí)現(xiàn)。
 *
 * Copyright(c) 2008 by guigui. All rights reserved.
 * @author guigui <[email protected]>
 * @version $Id: MemcacheSession.class.php, v 1.0 2008/12/22 $
 * @package systen
 * @link http://www.guigui8.com
 */

 
/**
 * class MemcacheSession
 *
 * 1. 設(shè)置客戶端的Cookie來(lái)保存SessionID
 * 2. 把用戶的數(shù)據(jù)保存在服務(wù)器端,通過(guò)Cookie中的Session Id來(lái)確定一個(gè)數(shù)據(jù)是否是用戶的
 */
class MemcacheSession
{
   // {{{ 類成員屬性定義
   public  $memObject          = null;      //memcache操作對(duì)象句柄
   private $_sessId            = '';
   private $_sessKeyPrefix     = 'sess_';
   private $_sessExpireTime    = 86400;  
   private $_cookieDomain      = '.guigui8.com';   //全域cookie域名
   private $_cookieName        = '_PROJECT_MEMCACHE_SESS';
   private $_cookieExpireTime  = '';   

   private $_memServers        = array('192.168.0.3' => 11211, '192.168.0.4' => 11211);
   private $_sessContainer     = array();     //當(dāng)前用戶的session信息
   private static $_instance   = null;      //本類單例對(duì)象
   // }}}

 
   /**
    * 單例對(duì)象獲取的靜態(tài)方法。
 * (可以順便提供memcache信息存儲(chǔ)服務(wù)器參數(shù))
    *
    * @param string $host   - memcache數(shù)據(jù)存儲(chǔ)服務(wù)器ip
    * @param integer $port  - memcache數(shù)據(jù)存儲(chǔ)服務(wù)器端口號(hào)
    * @param bool $isInit   - 是否實(shí)例化對(duì)象的時(shí)候啟動(dòng)Session
    */
   public static function getInstance($host='', $port=11211, $isInit = true) {
     if (null === self::$_instance) {
      self::$_instance = new self($host, $port, $isInit);
     }
     return self::$_instance;
   }

   /**
    * 構(gòu)造函數(shù)
    *
    * @param bool $isInit - 是否實(shí)例化對(duì)象的時(shí)候啟動(dòng)Session
    */
   private function __construct($host='', $port=11211, $isInit = false){
       !empty($host) && $this->_memServers = array(trim($host) => $port);
       $isInit && $this->start();
   }

   /**
  *=-----------------------------------------------------------------------=
  *=-----------------------------------------------------------------------=
 *      Public Methods
  *=-----------------------------------------------------------------------=
  *=-----------------------------------------------------------------------=
  */

   /**
    * 啟動(dòng)Session操作
    *
    * @param int $expireTime - Session失效時(shí)間,缺省是0,當(dāng)瀏覽器關(guān)閉的時(shí)候失效, 該值單位是秒
    */
   public function start($expireTime = 0){
       $_sessId = $_COOKIE[$this->_cookieName];
       if (!$_sessId){
           $this->_sessId = $this->_getId();
           $this->_cookieExpireTime = ($expireTime > 0) ? time() + $expireTime : 0;
           setcookie($this->_cookieName, $this->_sessId, $this->_cookieExpireTime, "/", $this->_cookieDomain);
           $this->_initMemcacheObj();

           $this->_sessContainer = array();
           $this->_saveSession();
       } else {
           $this->_sessId = $_sessId;
           $this->_sessContainer = $this->_getSession($_sessId);
       }       
   }

   /**
    * setSessId
    *
    * 自定義的session id,通常沒(méi)有必要經(jīng)過(guò)cookie操作處理的(所以省略了cookie記錄session_id)
    *
    * @param string $sess_id
    * @return boolean
    */
   public function setSessId($sess_id){
       $_sessId = trim($sess_id);
       if (!$_sessId){
           return false;
       } else {
           $this->_sessId = $_sessId;
           $this->_sessContainer = $this->_getSession($_sessId);
       }       
   }

   /**
    * 判斷某個(gè)Session變量是否注冊(cè)
    *
    * @param string $varName -
    * @return bool 存在返回true, 不存在返回false
    */
   public function isRegistered($varName){
       if (!isset($this->_sessContainer[$varName])){
           return false;
       }
       return true;
   }   

   /**
    * 注冊(cè)一個(gè)Session變量
    *
    * @param string $varName - 需要注冊(cè)成Session的變量名
    * @param mixed $varValue - 注冊(cè)成Session變量的值
    * @return bool - 該變量名已經(jīng)存在返回false, 注冊(cè)成功返回true
    */
   public function set($varName, $varValue){
       $this->_sessContainer[$varName] = $varValue;
       $this->_saveSession();
       return true;
   }

   /**
    * 獲取一個(gè)已注冊(cè)的Session變量值
    *
    * @param string $varName - Session變量的名稱
    * @return mixed - 不存在的變量返回false, 存在變量返回變量值
    */
   public function get($varName){
       if (!isset($this->_sessContainer[$varName])){
           return false;
       }
       return $this->_sessContainer[$varName];
   }   

   /**
    * 銷毀一個(gè)已注冊(cè)的Session變量
    *
    * @param string $varName - 需要銷毀的Session變量名
    * @return bool 銷毀成功返回true
    */
   public function delete($varName){
       unset($this->_sessContainer[$varName]);
       $this->_saveSession();
       return true;
   }

   /**
    * 銷毀所有已經(jīng)注冊(cè)的Session變量
    *
    * @return 銷毀成功返回true
    */
   public function destroy(){
       $this->_sessContainer = array();
       $this->_saveSession();
       return true;   
   }

 
   /**
    * 獲取所有Session變量
    *
    * @return array - 返回所有已注冊(cè)的Session變量值
    */
   public function getAll(){
       return $this->_sessContainer;
   }

   /**
    * 獲取當(dāng)前的Session ID
    *
    * @return string 獲取的SessionID
    */
   public function getSid(){
       return $this->_sessId;
   }

   /**
    * 獲取Memcache的服務(wù)器信息
    *
    * @return array Memcache配置數(shù)組信息
    */
   public function getMemServers(){
       return $this->_memServers;
   }

   /**
    * 設(shè)置Memcache的服務(wù)器信息
    *
    * @param string $host - Memcache服務(wù)器的IP
    * @param int $port - Memcache服務(wù)器的端口
    */
   public function setMemServers($arr){
       $this->_memServers = $arr;
   }   

   /**
    * 添加Memcache服務(wù)器
    *
    * @param string $host - Memcache服務(wù)器的IP
    * @param int $port - Memcache服務(wù)器的端口
    */
   public function addMemServer($host, $port){
       $this->_memServers[trim($host)] = trim($port);
       $this->memObject->addServer($host, $port);
   }  

   /**
    * 移除Memcache服務(wù)器(注意,這個(gè)只是移除配置,并不能實(shí)際從memcached的連接池移除)
    *
    * @param string $host - Memcache服務(wù)器的IP
    * @param int $port - Memcache服務(wù)器的端口
    */
   public function removeMemServer($host){
  unset($this->_memServers[trim($host)]);
   }  

   /**
  *=-----------------------------------------------------------------------=
  *=-----------------------------------------------------------------------=
 *      Private Methods
  *=-----------------------------------------------------------------------=
  *=-----------------------------------------------------------------------=
  */

   /**
    * 生成一個(gè)Session ID
    *
    * @return string 返回一個(gè)32位的Session ID
    */
   private function _getId(){
       return md5(uniqid(microtime()));
   }

   /**
    * 獲取一個(gè)保存在Memcache的Session Key
    *
    * @param string $_sessId - 是否指定Session ID
    * @return string 獲取到的Session Key
    */
   private function _getSessKey($_sessId = ''){
       $sessKey = ($_sessId == '') ? $this->_sessKeyPrefix.$this->_sessId : $this->_sessKeyPrefix.$_sessId;
       return $sessKey;
   }   
   /**
    * 檢查保存Session數(shù)據(jù)的路徑是否存在
    *
    * @return bool 成功返回true
    */
   private function _initMemcacheObj(){
       if (!class_exists('Memcache') || !function_exists('memcache_connect')){
           $this->_showMessage('Failed: Memcache extension not install, please from http://pecl.php.NET download and install');
       }       
       if ($this->memObject && is_object($this->memObject)){
           return true;
       }
       $this->memObject = new Memcache;
       if (!empty($this->_memServers)) {
          foreach ($this->_memServers as $_host => $_port) {
            $this->memObject->addServer($_host, $_port);
        }
       }

       return true;
   }

   /**
    * 獲取Session文件中的數(shù)據(jù)
    *
    * @param string $_sessId - 需要獲取Session數(shù)據(jù)的SessionId
    * @return unknown
    */
   private function _getSession($_sessId = ''){
       $this->_initMemcacheObj();
       $sessKey = $this->_getSessKey($_sessId);
       $sessData = $this->memObject->get($sessKey);
       if (!is_array($sessData) || empty($sessData)){
         //this must be $_COOKIE['__SessHandler'] error!
         return array();
       }
       return $sessData;
   }

   /**
    * 把當(dāng)前的Session數(shù)據(jù)保存到Memcache
    *
    * @param string $_sessId - Session ID
    * @return 成功返回true
    */
   private function _saveSession($_sessId = ''){
       $this->_initMemcacheObj();
       $sessKey = $this->_getSessKey($_sessId);

       if (empty($this->_sessContainer)){
           $ret = @$this->memObject->set($sessKey, $this->_sessContainer, false, $this->_sessExpireTime);
       }else{
           $ret = @$this->memObject->replace($sessKey, $this->_sessContainer, false, $this->_sessExpireTime);
       }

       if (!$ret){
           $this->_showMessage('Failed: Save sessiont data failed, please check memcache server');
       }
       return true;
   }

   /**
    * 顯示提示信息
    *
    * @param string $strMessage - 需要顯示的信息內(nèi)容
    * @param bool $isFailed - 是否是失敗信息, 缺省是true
    */
   private function _showMessage($strMessage, $isFailed = true){
     return;
       if ($isFailed){
           echo ($strMessage);
       }
       echo $strMessage;
   }   

應(yīng)用
1.本地session存儲(chǔ),與原始session操作方式一樣,沒(méi)有任何改變。如:
復(fù)制代碼 代碼如下:
session_start();
$_SESSION['file_session_info']= '本地文件保存的session信息'; //本地文件保存的session

2.memcache共享服務(wù)器的session存儲(chǔ)
復(fù)制代碼 代碼如下:
$mem= MemcacheSession::getInstance('192.168.0.4', 11211);
$mem->addMemServer('192.168.0.4',11211);
$mem->addMemServer('192.168.0.5',11211);
//如果cookie功能不可用,則根據(jù)其他參數(shù)傳遞的唯一信息,設(shè)置映射為session_id
if(1) {
$sn= '838ece1033bf7c7468e873e79ba2a3ec';
$mem->setSessId($sn);
}
$mem->set('name','guigui');  //多臺(tái)memcache服務(wù)器共享的session
$mem->set('addr','wuhan');  //多臺(tái)memcache服務(wù)器共享的session
//$mem->destroy();

3.分別獲取本地和memcache存儲(chǔ)的session信息
復(fù)制代碼 代碼如下:
$addr= $mem->get('addr');
$_MEM_SESSION= $mem->getAll();
echo"<hr>localhost file session:";
var_dump($_SESSION);
echo"<hr>memcache session:";
var_dump($_MEM_SESSION);
//$res= $mem->delete('name');

php技術(shù)深入Memcache的Session數(shù)據(jù)的多服務(wù)器共享詳解,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 扒开美女下面粉嫩粉嫩冒白浆 | 久久精品伊人 | 亚洲成色WWW久久网站夜月 | asmr淫语| 国产在线高清视频无码不卡 | 年轻的朋友4在线看中文字幕 | 久久亚洲AV成人无码动态图 | 双手绑在床头调教乳尖 | 亚洲 视频 在线 国产 精品 | 美女网站免费久久久久久久 | 99re 这里只有精品 | 免费看大黄高清网站视频在线 | 日本精品久久久久中文字幕 1 | 草莓西瓜樱桃香蕉直播视频 | 日本一本二本三区免费免费高清 | 伸进同桌奶罩里摸她胸作文 | 毛片基地看看成人免费 | 在线观看免费视频a | 亚洲精品成人AV在线观看爽翻 | 99精品国产免费观看视频 | qvod12| 精品久久香蕉国产线看观看麻豆 | 国产午夜高潮熟女精品AV | a亚洲在线观看不卡高清 | 亚洲成av人影院 | 国产成人免费不卡在线观看 | 国产亚洲精品久久久久5区 国产亚洲精品久久久久 | 亚洲精品另类有吗中文字幕 | 和老外3p爽粗大免费视频 | 在线黑人抽搐潮喷 | 无限资源日本2019版免费 | 草草色 | 欧美白妞大战非洲大炮 | 亚洲AV无码国产精品色在线看 | 亚洲精品天堂无码中文字幕影院 | 国产国拍亚洲精品永久软件 | 欧美亚洲日韩欧洲不卡 | a在线观看免费视频 | 亚洲国产在线视频中文字 | 国产在线精品一区二区在线看 | 麻豆Av国产在线播放 |