ホームページ  >  記事  >  バックエンド開発  >  PHPはmemcacheを使用してマルチサーバー共有セッションを実現します

PHPはmemcacheを使用してマルチサーバー共有セッションを実現します

WBOY
WBOYオリジナル
2016-07-25 08:56:061087ブラウズ
  1. ; データの保存/取得に使用されるハンドラー。
  2. session.save_handler = files; これはセッション メソッドであり、デフォルトのファイルで十分です。つまり、ファイル ストレージを意味します。
コードをコピーします
他にも user と memcache の 2 つの方法があります。 ユーザーモードとは、セッションへのアクセスなどに使用される、自分(つまりユーザー)が定義したセッションのハンドルを指します。これにより、セッションの拡張子をデータベースに保存できます。 memcache モードでは、memcache と session.save_path を設定する必要があります。

PHP の session.save_handler に memcache を使用します。

    ini_set("session.save_handler", "memcache");
  1. ini_set("session.save_path", "tcp://127.0.0.1:11211,tcp://192.168.1.12:11211") ;
コードをコピー
PHP の session.save_handler に memcached を使用します。

ini_set("session.save_handler","memcached");
  1. コードをコピーします

以下では、PHP がマルチサーバーセッション共有のための memcache 共有を実装する方法を紹介します。 例: セッション処理メカニズムをカスタマイズします。

  1. /* vim: set Expandtab tabstop=4Shiftwidth=4foldmethod=marker: */
  2. //================== = ========================
  3. // プログラム: Memcache ベースのセッション クラス
  4. // 関数: Memcache ストレージに基づくセッション関数クラス
  5. // = ==========================================
  6. /**
  7. * ファイル: MemcacheSession.inc.php
  8. * クラス名: MemcacheSession クラス
  9. * 機能: Memcache ストレージに基づいてセッション関数を独自に実装します
  10. * 説明: このクラスは基本的に
  11. を通じてセッション関数を実装します * クライアントの Cookie を設定しますSessionID を保存するには、
  12. * 次にユーザーのデータをサーバー側に保存し、最後に
  13. * Cookie 内のセッション ID を通じてデータがユーザーに属するかどうかを判断し、
  14. * その後、対応するデータ操作を実行します
  15. *
  16. * これMemcache に適した方法 セッションデータをメモリに保存する方法
  17. * 同時に分散 Memcache サーバーを構築すると、
  18. * 大量のキャッシュデータを保存できるため、大量のキャッシュデータが存在する状況に適しています
  19. *
  20. * 注: このクラスには PHP が必要です。 Memcache 拡張機能がインストールされているか、Memcache の PHP API が必要です
  21. * Memcache 拡張機能を入手するには、http://pecl.php.net にアクセスしてください。 */
  22. //SESSION 有効時間を秒単位で設定します
  23. define('SESS_LIFTTIME', 3600);
  24. //memcache 構成情報を定義します
  25. define('MEMCACHE_HOST', 'localhost'); , '10000');
  26. if (!dependent('MemcacheSession'))
  27. {
  28. define('MemcacheSession', TRUE);
  29. class MemacheSession
  30. {
  31. // {{{ クラスメンバー属性の定義
  32. static $mSessSavePath ;
  33. static $mSessName;
  34. static $mMemcacheObj;
  35. // }}}
  36. // {{{ 初期化コンストラクター
  37. /**
  38. * コンストラクター
  39. *
  40. * @param string $login_user ログインユーザー
  41. * @param int $login_type ユーザータイプ
  42. * @param string $login_sess ログインセッション値
  43. * @return エセッション
  44. */
  45. public function __construct()
  46. {
  47. //My memcache コンパイルされるphp モジュールとして直接呼び出すことができます
  48. //そうでない場合は、Memcache-client.php ファイルを自分でインクルードしてください
  49. if (!class_exists('Memcache') || !function_exists('memcache_connect'))
  50. {
  51. die( '致命的なエラー: Memcache 拡張機能を読み込めません!');
  52. }
  53. if (!empty(self::$mMemcacheObj) && is_object(self::$mMemcacheObj))
  54. {
  55. return false }
  56. self: :$mMemcacheObj = 新しい Memcache;
  57. if (!self::$mMemcacheObj->connect(MEMCACHE_HOST , MEMCACHE_PORT))
  58. {
  59. die('致命的なエラー: memcache ホストに接続できません '.MEMCACHE_HOST . ':'. MEMCACHE_PORT);
  60. }
  61. return TRUE; }
  62. // }}}
  63. /**{{{ sessOpen($pSavePath, $name)
  64. *
  65. * @param String $pSavePath
  66. * @param String $pSessName
  67. *
  68. * @return Bool TRUE/FALSE
  69. */
  70. public function sessOpen($pSavePath = '', $pSessName = '')
  71. {
  72. self: :$mSessSavePath = $pSavePath;
  73. self::$mSessName = $pSessName;
  74. return TRUE; }
  75. // }}}
  76. /**{{{ sessClose()
  77. *
  78. * @param NULL
  79. *
  80. * @return Bool TRUE/FALSE
  81. */
  82. public function sessClose()
  83. return TRUE ;
  84. }
  85. // }}}
  86. /**{{{ sessRead($wSessId)
  87. *
  88. * @param String $wSessId
  89. *
  90. * @return Bool TRUE/FALSE
  91. */
  92. public function sessRead($wSessId = '')
  93. {
  94. $wData = self::$mMemcacheObj->get( $wSessId);
  95. //最初にデータを読み取り、そうでない場合は 1 つを初期化します
  96. if (!empty($wData))
  97. {
  98. return $wData; }
  99. else
  100. {
  101. // 空のレコードを初期化します
  102. $ ret = self: :$mMemcacheObj->set($wSessId, '', 0, SESS_LIFTTIME);
  103. if (TRUE != $ret)
  104. {
  105. die("致命的なエラー: セッション ID $wSessId の初期化に失敗しました!") ;
  106. return FALSE ;
  107. }
  108. TRUE を返す
  109. }
  110. // }}}
  111. /**{{{ sessWrite($wSessId, $wData)
  112. *
  113. * @param String $wSessId
  114. * @param String $wData
  115. *
  116. * @return Bool TRUE/FALSE
  117. */
  118. public function sessWrite($wSessId = '', $wData = '')
  119. {
  120. $ret = self::$mMemcacheObj->replace($wSessId, $wData, 0 , SESS_LIFTTIME);
  121. if (TRUE != $ret)
  122. {
  123. die("致命的なエラー: セッション ID $wSessId データの保存に失敗しました!");
  124. return FALSE }
  125. // }}}
  126. /**{{{ sessDestroy($wSessId)
  127. *
  128. * @param String $wSessId
  129. *
  130. * @return Bool TRUE/FALSE
  131. */
  132. public function sessDestroy($wSessId = '')
  133. {
  134. self::sessWrite($wSessId)
  135. return
  136. }
  137. // }}}
  138. /** {{{ sessGc()
  139. *
  140. * @param NULL
  141. *
  142. * @return Bool TRUE/FALSE
  143. */
  144. public function sessGc()
  145. {
  146. //追加のリサイクルは必要ありません。memcache には独自の期限切れリサイクル メカニズムがあります
  147. return TRUE; }
  148. // }}}
  149. /**{{{ initSess()
  150. *
  151. * @param NULL
  152. *
  153. * @return Bool TRUE/FALSE
  154. */
  155. public function initSess()
  156. {
  157. //GET/POST 変数メソッドを使用しない
  158. ini_set('session.use_trans_sid', 0);
  159. //ガベージ コレクションの最大有効期間を設定する
  160. ini_set('session.gc_maxlifetime' , SESS_LIFTTIME) ;
  161. //COOKIE を使用してセッション ID を保存する方法
  162. ini_set('session.cookie_path', '/'); .cn';
  163. //複数のホストがセッション ID を保存する COOKIE を共有します
  164. ini_set('session.cookie_domain', $domain);
  165. //デフォルト ファイルの代わりに session.save_handler を設定します
  166. session_module_name('user ');
  167. //さまざまな SESSION 操作に対応するメソッド名を定義します。
  168. session_set_save_handler(
  169. array('MemacheSession', 'sessOpen'), // 静的メソッド My_Sess::open() に対応します。以下同様。
  170. array('MemacheSession', 'sessClose'),
  171. array('MemacheSession', 'sessRead'),
  172. array('MemacheSession', 'sessWrite'),
  173. array('MemacheSession', 'sessDestroy'),
  174. array ('MemacheSession', 'sessGc')
  175. );
  176. session_start();
  177. return TRUE; }
  178. // }}}
  179. }//end
  180. $memSess = new MemacheSession;
  181. $memSess->initSess();
  182. ?>
  183. このクラスを使用するには、プログラムのヘッダー ファイルに直接 MemacheSession.inc.php を含めます。
  184. テスト例。 1. セッションを作成する
//set_session.php session_start();
if (!isset($_SESSION['admin'])) {

$_SESSION['TEST'] = 'wan';

}

print $_SESSION['admin'];

print "/n";
?>
  1. コードをコピー
  2. 2、memcached でクエリを実行します。
  3. //get_session.php
  4. $mem = 新しい Memcache;
$mem->connect("127.0.0.1", 11211);
var_dump($mem->get() '0935216dbc0d721d629f89efb89affa6')); ?>

コードをコピー

注: memcache PECL 将来のバージョンでは、php.ini を直接設定して session.save_handler を設定できるようになります。
  1. 例:
  2. session.save_handler = memcache session.save_path = "tcp://host:port?persistent=1&weight=2&timeout=2&retry_interval=15,tcp://host2:port2"
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。