コードは次のとおりです:
/**
*=---------------------------------------------- --- ----------------------------=
* ---------------------------------- ------------------------=
*
* Memcache ストレージに基づいてセッション機能を実装します
* (セッションメカニズムをシミュレートします。memcache を使用してストレージメディアを共有サーバーのメモリに置き換えるだけです)
*
* 欠点: 現在、セッションを導入するための実装戦略がありません。異なるプライマリドメインの共有メカニズム。つまり、同じメイン ドメイン内の実装のみがサポートされます。
*
* Copyright(c) 2008 by guigui.All Rights Reserved.
* @author guigui
* @version $Id: MemcacheSession.class.php、v 1.0 2008/12/22 $
* @パッケージシステム
* @link http://www.guigui8.com
*/
/**
* class MemcacheSession
*
* 1. セッションIDを保存するようにクライアントのCookieを設定します
* 2. ユーザーのデータをサーバー側に保存し、Cookie内のセッションIDを通じてデータがユーザーに属するかどうかを判断します
*/
class MemcacheSession
{
// {{{ クラスメンバー属性定義
public $memObject = null //memcache 操作オブジェクトハンドル
private $_sessId = '';
private $_sessKeyPrefix = 'sess_';
private $_sessExpireTime = 86400;
private $_cookieDomain = '.guigui8.com' //グローバル Cookie ドメイン名
= '_PROJECT_MEMCACHE_SESS';
private $ _cookieExpireTime = '';
private $_memServers = array('192.168.0.3' => 11211, '192.168.0.4' => 11211);
private $_sessContainer = array(); //現在のユーザーのセッション情報
private static $_instance = null; //このクラスのシングルトンオブジェクト
// }}}
/**
* シングルトンオブジェクトを取得する静的メソッド。
* (ちなみに、memcache 情報ストレージのサーバー パラメーターを指定できます)
*
* @param string $host - memcache データ ストレージのサーバー IP
* @param integer $port - memcache データ ストレージのサーバー ポート番号
* @param bool $ isInit - オブジェクトのインスタンス化時にセッションを開始するかどうか
*/
public static function getInstance($host='', $port=11211, $isInit = true) {
if (null ===) self::$_instance) {
'', $port=11211, $isInit = false){
!empty($host) && $this->_memServers = array(trim($host) => $port );
$isInit && $this- >start();
}
/**
* コンストラクター
* *
* @param bool $isInit - オブジェクトのインスタンス化時にセッションを開始するかどうか
*/
/**
*=-------------------------------------------- ------------------------=
*=---------------------- --------------------------------------------------=
* パブリックメソッド
*=------------------------------------------ ------------------------=
*=-------------- -------------------------------------------------- ---=
*/
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-> $this->_sessContainer = $this-> ;_getSession($_sessId);
essId){
return false }
/**
* セッション操作を開始します
**/
public function isRegistered($varName){
if (!isset($this->_sessContainer[$varName])){
return false;
return true;
}
/**
* * セッション変数を登録します
* *
* @param string $varName - セッションとして登録する必要がある変数名
* @parammixed $varValue - 登録する必要があるセッション変数の値
* @ return bool - 変数名はすでに存在します。 false を返します。登録は成功し、true を返します
*/
public function set($varName, $varValue){
$this->_sessContainer[$varName] = $varValue;
$this->_saveSession();
return true ;
}
/**
* 登録されたセッション変数の値を取得します
**/
public function get($varName){
if (!isset($this->_sessContainer[$varName])){
return false;
}
return $ this->_sessContainer[$varName];
}
/**
* 登録されたセッション変数を破棄します
*
* @param string $varName - 破棄する必要があるセッション変数の名前
* @return bool 破棄が成功した場合は true を返します
*/
public function delete($varName){
unset($this->_sessContainer[$varName]);
$this- >_saveSession();
return true;
}
/**
* 登録されているすべてのセッション変数を破棄します
*
* 破棄が成功した場合は @return true
*/
public function destroy(){
$this->_sessContainer = array();
$this->_saveSession() ;
true を返します。
}
/**
* すべてのセッション変数を取得します
*
* @return array - 登録されているすべてのセッション変数値を返します
*/
public function getAll(){
return $this->_sessContainer;
}
/**
* 現在のセッション ID を取得します
*
* @return string セッション ID を取得します
*/
public function getSid(){
return $this->_sessId;
}
/**
* Memcache サーバー情報の取得
*
* @return array Memcache 構成配列情報
*/
public function getMemServers(){
return $this->_memServers;
}
/**
* Memcache サーバー情報を設定します
*
* @param string $host - Memcache サーバーの IP
* @param int $port - Memcache サーバーのポート
*/
public function setMemServers($arr){
$this->_memServers = $arr;
}
/**
* Memcache サーバーを追加します
*
* @param string $host - Memcache サーバーの IP
* @param int $port - Memcache サーバーのポート
*/
public function addMemServer($host, $port){
$this->_memServers[trim ($host)] = trim($port);
$this->memObject->addServer($host, $port);
}
/**
* Memcache サーバーを削除します (これは構成を削除するだけであり、実際に Memcached 接続プールから削除することはできないことに注意してください)
*
* @param string $host - Memcache サーバーの IP
* @param int $port - Memcache サーバーのポート
*/
public function RemoveMemServer($host) ){
unset($this->_memServers[trim($host)]);
}
/**
*=-------------------------------------------- ------------------------=
*=---------------------- --------------------------------------------------=
* プライベートメソッド
*=------------------------------------------ ------------------------=
*=-------------- -------------------------------------------------- ---=
*/
/**
* セッション ID を生成します
*
* @return string 32 ビットのセッション ID を返します
*/
private function _getId(){
return md5(uniqid(microtime()));
}
/**
* Memcache に保存されているセッションキーを取得します
*
* @param string $_sessId - セッション ID を指定するかどうか
* @return string 取得したセッションキー
* /
プライベート関数 _getSessKey($_sessId = ''){
$sessKey = ($_sessId == '') ? $this->_sessKeyPrefix.$this->_sessId : $this->_sessKeyPrefix.$_sessId;
return $sessKey;
}
/**
* セッションデータを保存するパスが存在するか確認します
*
* @return bool 成功した場合は true を返します
*/
プライベート関数 _initMemcacheObj(){
もし( !class_exists('Memcache') || !function_exists('memcache_connect')){
$this->showMessage('失敗: Memcache 拡張機能がインストールされません。http://pecl.php.net からダウンロードしてインストールしてください') ;
}
if ($this->memObject && is_object($this->memObject)){
return true;
}
$this->memObject = 新しい Memcache;
if (!empty($this- >_memServers)) {
foreach ($this->_memServers as $_host => $_port) {
$this->memObject->addServer($_host, $_port);
}
}
return true;
}
/**
* セッションファイル内のデータを取得します
**/
private function _getSession($_sessId = ''){
$this->_initMemcacheObj();
$sessKey = $this->_getSessKey($_sessId );
$sessData = $this->memObject->get($sessKey);
if (!is_array($sessData) || empty($sessData)){
//これは $_COOKIE['__SessHandler である必要があります'] エラー!
return array();
}
return $sessData;
}
/**
* 現在のセッション データを Memcache に保存します
*
* @param string $_sessId - セッション ID
* @return 成功した場合は true を返します
*/
private function _saveSession($_sessId = ''){
$this->_in itMemcacheObj() ;
$sessKey = $this->gt;_getSessKey($_sessId);
if (empty($this->gt;_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- & gt; _Showmessage ('失敗: セッション データの保存に失敗しました。memcache サーバーを確認してください') *
* プロンプトメッセージを表示します
*
* @param string $strMessage – 表示されるメッセージの内容
* @param bool $isFailed – 失敗メッセージかどうか、デフォルトは true です
*/
private function _showMessage($strMessage, $isFailed = true); {
return;
if ($isFailed){
echo ($strMessage);
}
echo $strMessage;
}
4 つのアプリ
1. ローカル セッション ストレージは元のセッションと同じです。何も変更せずに動作します。
例:
コードをコピーします コードは次のとおりです:
session_start();$_SESSION['file_session_info']= 'ローカル ファイルに保存されたセッション情報' // ローカルに保存されたセッションファイル2. Memcache共有サーバーのセッションストレージ
コピーコード
コードは次のとおりです。 mem->addMemServer('192.1 68 .0.4',11211);
$mem->addMemServer('192.168.0.5',11211);
//Cookie 関数が使用できない場合は、マッピングを session_id ベースに設定します他のパラメータによって渡される固有の情報について
if(1 ) {$sn= '838ece1033bf7c7468e873e79ba2a3ec';
$mem->setSessId($sn);}$mem->set('name','guigui '); //複数の memcache サーバーで共有されるセッション $mem->set('addr','wuhan') //複数の memcache サーバーで共有されるセッション //$mem->destroy();
3. ローカルストレージとmemcacheストレージをそれぞれ取得します
コードをコピーします
コードは次のとおりです:
$addr= $mem->get('addr');
$_MEM_SESSION= $mem->getAll();
echo"
localhost ファイル セッション:";var_dump($_SESSION);
echo"
memcache セッション:";var_dump($_MEM_SESSION);
/ /$res= $mem->delete('name');
http://www.bkjia.com/PHPjc/327560.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/327560.html
技術記事
関連する概要 1. memcache + memcache のマルチサーバー データ共有の概要については、http://www.guigui8.com/index.php/archives/206.html を参照してください。 2. セッション メカニズム: セッション メカニズムはサービス..