>  기사  >  백엔드 개발  >  PHP는 Memcache를 사용하여 다중 서버 공유 세션을 실현합니다.

PHP는 Memcache를 사용하여 다중 서버 공유 세션을 실현합니다.

WBOY
WBOY원래의
2016-07-25 08:56:061082검색
  1. [Session]
  2. ; 데이터 저장/검색에 사용되는 핸들러.
  3. session.save_handler = files; , 파일에 저장되어 있음을 나타냅니다.
코드 복사

사용자 방법과 Memcache 두 가지 방법이 있습니다. 사용자 모드는 자신(즉, 사용자)이 정의한 세션의 핸들을 말하며 세션 액세스 등에 사용됩니다. 이는 세션 확장을 데이터베이스에 저장할 수 있습니다. Memcache 모드에서는 memcache 및 session.save_path를 구성해야 합니다.

PHP의 session.save_handler에 memcache를 사용하세요.

  1. ini_set("session.save_handler", "memcache")
  2. ini_set("session.save_path", "tcp://127.0.0.1 :11211,tcp://192.168.1.12:11211");
코드 복사

PHP의 session.save_handler에 memcached를 사용하세요.

  1. ini_set("session.save_handler","memcached")
  2. ini_set("session.save_path","127.0.0.1:11211") ;
코드 복사

다음은 PHP가 다중 서버 세션 공유를 위해 Memcache 공유를 구현하는 방법을 설명합니다. 예: 세션 처리 메커니즘을 사용자 정의합니다.

  1. /* vim: setexpandtab tabstop=4shiftwidth=4foldmethod=marker: */
  2. //===== ======================================
  3. // 프로그램: Memcache 기반 세션 클래스
  4. // 함수: Memcache 스토리지 기반 세션 함수 클래스
  5. //=============================== = ============
  6. /**
  7. * 파일: MemcacheSession.inc.php
  8. * 클래스명: MemcacheSession 클래스
  9. * 기능: Memcache 스토리지 기반으로 Session 기능을 독립적으로 구현
  10. * 설명: Session 기능을 구현하는 클래스 , 기본적으로
  11. * 클라이언트의 쿠키를 설정하여 세션 ID를 저장하고,
  12. * 그런 다음 사용자의 데이터를 서버 측에 저장하고, 마지막으로
  13. * 쿠키의 세션 ID를 사용하여 여부를 확인합니다. 데이터는 사용자에게 속합니다.
  14. * 그런 다음 해당 데이터 작업을 수행합니다.
  15. *
  16. * 이 방법은 세션 데이터의 Memcache 메모리 저장에 적합합니다.
  17. * 동시에 분산을 구축하는 경우 Memcache 서버
  18. *는 상당히 많은 캐시 데이터를 저장할 수 있으며, 사용자 수가 많고 동시성이 큰 상황에 적합합니다.
  19. *
  20. * 참고: 이 클래스에는 PHP가 있어야 합니다. Memcache 확장 프로그램이 설치되어 있거나 Memcache의 PHP API를 사용할 수 있어야 합니다.
  21. * Memcache 확장 프로그램을 받으려면 http://pecl.php.net을 방문하세요.
  22. */
  23. //SESSION 유효 시간을 초 단위로 설정
  24. define('SESS_LIFTTIME ' , 3600);
  25. //Memcache 구성 정보 정의
  26. define('MEMCACHE_HOST', 'localhost')
  27. define('MEMCACHE_PORT', '10000'); if (!definated('MemcacheSession'))
  28. {
  29. Define('MemcacheSession', TRUE);
  30. class MemacheSession
  31. {
  32. // {{{ 클래스 멤버 속성 정의
  33. static $mSessSavePath;
  34. static $mSessName;
  35. static $mMemcacheObj
  36. // }}}
  37. // {{{ 초기화 생성자
  38. /**
  39. * 생성자
  40. *
  41. * @param string $login_user 로그인 사용자
  42. * @param int $login_type 사용자 유형
  43. * @param string $login_sess 로그인 세션 값
  44. * @return Esession
  45. */
  46. public function __construct()
  47. {
  48. //내 Memcache는 PHP 모듈로 컴파일되어 직접 호출할 수 있습니다.
  49. //그렇지 않은 경우 Memcache-client를 직접 .php 파일에 포함하세요.
  50. if (!class_exists('Memcache') || !function_exists('memcache_connect'))
  51. {
  52. die('치명적인 오류: Memcache 확장 프로그램을 로드할 수 없습니다!')
  53. }
  54. if (!empty(self::$mMemcacheObj) && is_object(self::$mMemcacheObj))
  55. {
  56. return false
  57. }
  58. self: :$mMemcacheObj = new Memcache ;
  59. if (!self::$mMemcacheObj->connect(MEMCACHE_HOST , MEMCACHE_PORT))
  60. {
  61. die('치명적인 오류: Memcache 호스트 '.MEMCACHE_HOST .'에 연결할 수 없습니다.': '.MEMCACHE_PORT);
  62. }
  63. return TRUE;
  64. }
  65. // }}}
  66. /**{{{ sessOpen($pSavePath, $name)
  67. *
  68. * @param String $pSavePath
  69. * @param String $pSessName
  70. *
  71. * @return Bool TRUE/FALSE
  72. */
  73. 공개 함수 ($pSavePath = '', $pSessName = '')
  74. {
  75. self::$mSessSavePath = $pSavePath;
  76. self::$mSessName =
  77. return TRUE; }
  78. // }}}
  79. /**{{{ sessClose()
  80. *
  81. * @param NULL
  82. *
  83. * @return Bool TRUE/FALSE
  84. */
  85. 공개 함수 sessClose()
  86. {
  87. return TRUE; }}}
  88. /**{{{ sessRead($wSessId)
  89. *
  90. * @param String $wSessId
  91. *
  92. * @return Bool TRUE/FALSE
  93. */
  94. 공개 함수 sessRead($wSessId = '')
  95. {
  96. $wData = self::$ mMemcacheObj->get( $wSessId);
  97. //데이터를 먼저 읽고 그렇지 않으면 초기화합니다.
  98. if (!empty($wData))
  99. {
  100. return $wData }
  101. else
  102. {
  103. //빈 레코드 초기화
  104. $ret = self::$mMemcacheObj->set($wSessId, '', 0, SESS_LIFTTIME) if (TRUE ! = $ret)
  105. {
  106. die("치명적인 오류: 세션 ID $wSessId 초기화 실패!")
  107. return FALSE;
  108. }
  109. return TRUE; }
  110. // }}}
  111. /**{{{ sessWrite($wSessId, $wData)
  112. *
  113. * @param String $wSessId
  114. * @param String $wData
  115. *
  116. * @return Bool TRUE/FALSE
  117. */
  118. 공개 함수 sessWrite($wSessId = '', $wData = '')
  119. {
  120. $ret = self::$mMemcacheObj-> ;replace($wSessId, $wData, 0, SESS_LIFTTIME);
  121. if (TRUE != $ret)
  122. {
  123. die("치명적인 오류: SessionID $wSessId 데이터 저장에 실패했습니다!"); > FALSE 반환
  124. }
  125. TRUE 반환
  126. }
  127. // }}}
  128. /**{{{ sessDestroy($wSessId)
  129. *
  130. * @param String $wSessId
  131. *
  132. * @return Bool TRUE/FALSE
  133. */
  134. 공개 함수 sessDestroy($wSessId = '')
  135. {
  136. self::sessWrite($wSessId);
  137. return FALSE;
  138. }
  139. // }}}
  140. /**{{{ sessGc()
  141. *
  142. * @param NULL
  143. *
  144. * @return Bool TRUE/FALSE
  145. * /
  146. 공개 함수 sessGc()
  147. {
  148. //추가 재활용이 필요하지 않습니다. Memcache에는 만료된 자체 재활용 메커니즘이 있습니다.
  149. return TRUE
  150. }
  151. // }}}
  152. /**{{{ initSess()
  153. *
  154. * @param NULL
  155. *
  156. * @return Bool TRUE/FALSE
  157. */
  158. public function initSess()
  159. {
  160. //GET/POST 변수 메서드를 사용하지 마세요.
  161. ini_set('session.use_trans_sid', 0 );
  162. //최대 가비지 수집 수명 설정
  163. ini_set('session.gc_maxlifetime', SESS_LIFTTIME)
  164. //COOKIE를 사용하여 세션 ID 저장
  165. ini_set(' session.use_cookies', 1);
  166. ini_set('session.cookie_path', '/');
  167. $domain = '.imysql.cn'
  168. // 세션 ID 쿠키
  169. ini_set('session.cookie_domain', $domain);
  170. //기본 파일 대신 session.save_handler를 user로 설정
  171. session_module_name('user');
  172. //다양한 SESSION 작업에 해당하는 메서드 이름을 정의합니다.
  173. session_set_save_handler(
  174. array('MemacheSession', 'sessOpen'), //정적 메서드 My_Sess::open()에 해당합니다. 아래에 .
  175. array('MemacheSession', 'sessClose'),
  176. array('MemacheSession', 'sessRead'),
  177. array('MemacheSession', 'sessWrite'),
  178. array('MemacheSession' , 'sessDestroy'),
  179. array('MemacheSession', 'sessGc')
  180. )
  181. session_start()
  182. return TRUE; }}
  183. }//end class
  184. }//end 정의
  185. $memSess = new MemacheSession
  186. $memSess->initSess()
  187. 코드를 복사하세요
이 클래스를 사용하려면 프로그램의 헤더 파일에 MemacheSession.inc.php를 직접 포함하세요.
테스트 예시. 1. 세션 생성

//set_session.php
session_start()
    if (!isset($_SESSION['admin) '])) {
  1. $_SESSION['TEST'] = '완';
  2. }
  3. $_SESSION['admin'] 인쇄
  4. 인쇄 "/n"; ();
  5. ?>
  6. 코드 복사
  7. 2, memcached에서 쿼리하려면 sessionid를 사용하세요.

    //get_session.php

    $mem = new Memcache
    $mem->connect(" 127.0.0.1", 11211);

      var_dump($mem->get('0935216dbc0d721d629f89efb89affa6'));
    1. ?>
    2. 코드 복사
    3. 참고: Memcache PECL의 향후 버전에서는 php.ini를 직접 설정하여 session.save_handler를 설정할 수 있습니다.
    예: session.save_handler = 멤캐시 session.save_path = "tcp://host:port?percious=1&weight=2&timeout=2&retry_interval=15,tcp://host2:port2"

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.