ホームページ > バックエンド開発 > PHPチュートリアル > Memcache_PHP チュートリアルでのセッション データのマルチサーバー共有の詳細な説明

Memcache_PHP チュートリアルでのセッション データのマルチサーバー共有の詳細な説明

WBOY
リリース: 2016-07-21 15:07:03
オリジナル
752 人が閲覧しました

関連する紹介
1. memcache + memcache のマルチサーバー データ共有の概要については、http://www.guigui8.com/index.php/archives/206.html

2.session を参照してください。メカニズム:
セッション メカニズムはサーバー側のメカニズムであり、サーバーは情報を保存するためにハッシュ テーブルに似た構造を使用します (またはハッシュ テーブルを使用する場合もあります)。
プログラムがクライアントのリクエストに対してセッションを作成する必要がある場合、サーバーはまずクライアントのリクエストに sessionid と呼ばれるセッション識別子が既に含まれているかどうかを確認します。セッション ID が既に含まれている場合は、そのリクエストが以前にこのクライアント用に作成されたことを意味します。セッションを渡した後、サーバーはセッション ID に従ってセッションを取得し、それを使用します (取得できない場合は、新しいセッションを作成する可能性があります)。クライアントのリクエストにセッション ID が含まれていない場合は、クライアント用にセッションが作成されます。セッションはセッション ID に関連付けられて生成されます。セッション ID の値は、繰り返されず、模倣するパターンが簡単に見つからない文字列である必要があります。このセッション ID は、この応答で保存するためにクライアントに返されます。

Cookie を使用してこのセッション ID を保存すると、対話プロセス中にブラウザーがルールに従ってこの ID をサーバーに自動的に表示できるようになります。

通常、この Cookie の名前は SEEESIONID に似ています。たとえば、WebLogic によって生成された Cookie PHPSESSID=ByOK3vjFD75aPnrF3K2HmdnV6QZcEbzWoWiBYEnLerj の場合、その名前は PHPSESSID です。

2 番目の動機
実際の Web 制作環境では、アプリケーション システムがさまざまなビジネス アプリケーションをさまざまなサーバーに分散して処理することがよくあります。
現在のオンライン ユーザー情報を追跡する場合、それが同じプライマリ ドメイン名であれば、グローバル Cookie を使用して関連データの共有を処理できます。それが異なるプライマリ ドメインにある場合は、中心的な概念を通じて対応する問題を解決できます。オブザーバー モード この概念によって拡張されたソリューションは数多くありますが、今日説明するのは前者で、memcache のマルチサーバー データ共有テクノロジを使用してセッションをシミュレートし、現在のオンライン ユーザー データを複数のサーバーで共有します。

複数サーバーのセッション情報の統合については、以下の要件があります:
1. memcached で指定された複数のサーバーにセッション情報を保存できること (先ほど紹介した memcache のマルチサーバー データ共有を通じて)。 2. zend に似せることができるようにする session_start() を定義する前に、session_id($sessid) を通じて session_id の値をカスタマイズします。
3. システムの実行中に、memcached に保存されたセッション情報とファイルに保存されたセッション情報を簡単に切り替えることができます。

3つのコード
実装方法は非常に簡単で、memcacheを使用してセッションメカニズムをシミュレートし、複数間でセッション情報を共有するという目的を達成するために記憶媒体を共有サーバーのメモリに置き換えるだけです。分散展開サーバー。呼び出しインターフェースはzendが提供するセッション操作機能とは異なるため、memcacheとファイルのセッション情報操作を簡単に切り替えることができます。
次のコードは何度もテストされており、上記の機能要件を満たすことができます。まずは以下に投稿します:


コードをコピーします コードは次のとおりです:

/**
*=---------------------------------------------- --- ----------------------------=
* ---------------------------------- ------------------------=
*
* 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

tru​​e

http://www.bkjia.com/PHPjc/327560.html

技術記事

関連する概要 1. memcache + memcache のマルチサーバー データ共有の概要については、http://www.guigui8.com/index.php/archives/206.html を参照してください。 2. セッション メカニズム: セッション メカニズムはサービス..

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート