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

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

Jul 21, 2016 pm 03:07 PM
memcachesession1つ導入共有データサーバ深く行く関連している詳しい説明

関連する紹介
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. セッション メカニズム: セッション メカニズムはサービス..

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPの現在のステータス:Web開発動向を見てくださいPHPの現在のステータス:Web開発動向を見てくださいApr 13, 2025 am 12:20 AM

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHP対その他の言語:比較PHP対その他の言語:比較Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHP対Python:コア機能と機能PHP対Python:コア機能と機能Apr 13, 2025 am 12:16 AM

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHP:Web開発の重要な言語PHP:Web開発の重要な言語Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHP:多くのウェブサイトの基礎PHP:多くのウェブサイトの基礎Apr 13, 2025 am 12:07 AM

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

誇大広告を超えて:今日のPHPの役割の評価誇大広告を超えて:今日のPHPの役割の評価Apr 12, 2025 am 12:17 AM

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPの弱い参照は何ですか、そしていつ有用ですか?PHPの弱い参照は何ですか、そしていつ有用ですか?Apr 12, 2025 am 12:13 AM

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

PHPで__invoke Magicメソッドを説明してください。PHPで__invoke Magicメソッドを説明してください。Apr 12, 2025 am 12:07 AM

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター