>  기사  >  백엔드 개발  >  PHP 세션을 대체하기 위해 mysql 메모리 테이블을 사용하는 클래스

PHP 세션을 대체하기 위해 mysql 메모리 테이블을 사용하는 클래스

WBOY
WBOY원래의
2016-07-25 08:57:23818검색
  1. /**
  2. * session mysql内存表
  3. @Usage: php sessoin 대신 다른 저장 방법(mysql 또는 memcache) 사용
  4. @author:lein
  5. @Version:1.2
  6. */
  7. session_start();
  8. if(!isset($_SESSION['test'])){
  9. $_SESSION['test']="123_lein_".date("Y-m-d H:i:s");
  10. }
  11. 수업 세션{
  12. //세션 데이터
  13. private $data;
  14. //엔진,mysql 또는 memcache
  15. private $engine;
  16. //php 세션 만료 시간
  17. private $sessionexpiredTime;
  18. //현재 사용자의 세션 쿠키 값
  19. private $sessionID;
  20. //세션 쿨리 이름
  21. private $sessionCookieName;
  22. 공용 함수 session($engineBase=NULL,$engineName='mysql',$storage_name='php_session'){
  23. try{
  24. $this->sessionexpiredTime = intval(ini_get("session.cache_expire) "))*10;//默认是180分钟,太长了,改为了30分钟
  25. }catch(Exception $Exception){
  26. $this->sessionexpiredTime = 1200;
  27. }
  28. try{
  29. $this->sessionCookieName = ini_get("session.name");
  30. }catch(예외 $Exception){
  31. $this->sessionCookieName = 'PHPSESSID';
  32. }
  33. if(!isset($_COOKIE[$this->sessionCookieName])){
  34. @session_start();
  35. $this->sessionID=session_id();
  36. }else{
  37. $this->sessionID=$_COOKIE[$this->sessionCookieName];
  38. }
  39. $className = $engineName."SessionEngine";
  40. $this->engine = new $className(
  41. array(
  42. 'storage_name'=>$storage_name,//데이터를 저장하는 mysql 테이블 이름 또는 memcahce 키;
  43. 'expire_time'= >$this->sessionexpiredTime,
  44. 'data_too_long_instead_value' => '{__DATA는 *$* TO LONG__}'
  45. ),
  46. $this->sessionID,
  47. &$engineBase
  48. );
  49. $this->init();
  50. $this->loadFromSession();
  51. $this->엔진->refresh();
  52. $this->엔진->cleanup();
  53. }
  54. 비공개 함수 init()
  55. {
  56. $this->data = $this->engine->get();
  57. if(empty($this->data)){
  58. @session_start();
  59. if(!empty($_SESSION)){
  60. $this->data = $_SESSION;
  61. $this->engine->create(false, $this->data);
  62. }
  63. else
  64. {
  65. $this->engine->create(false, "");
  66. }
  67. }
  68. }
  69. 공개 함수 loadFromSession($flagStartSession = false){
  70. $flag=false;
  71. if($flagStartSession){
  72. @session_start();
  73. }
  74. if($_SESSION&&is_array($_SESSION)){
  75. foreach($_SESSION as $k=>$v){
  76. if(!isset($this->data[$ k])){
  77. $this->data[$k] = $v;
  78. $플래그=true;
  79. }
  80. }
  81. }
  82. if($flag){
  83. $this->engine->set(false, $this->data);
  84. }
  85. }
  86. 비공개 함수 __get($nm)
  87. {
  88. if (isset($this->data[$nm])) {
  89. $r = $this ->데이터[$nm];
  90. $r 반환;
  91. }
  92. else
  93. {
  94. NULL 반환;
  95. }
  96. }
  97. 비공개 함수 __set($nm, $val)
  98. {
  99. $this->data[$nm] = $val;
  100. $this->engine->set(false, $this->data);
  101. }
  102. 비공개 함수 __isset($nm)
  103. {
  104. return isset($this->data[$nm]);
  105. }
  106. 비공개 함수 __unset($nm)
  107. {
  108. unset($this->data[$nm]);
  109. $this->engine->set(false, $this->data);
  110. }
  111. function __destruct(){
  112. $this->data = NULL;
  113. $this->엔진->close();
  114. $this->엔진 = NULL;
  115. }
  116. }
  117. interface SessionEngine
  118. {
  119. /*
  120. * 변수 설정
  121. * @param $arr array,array(변수 이름=>변수 값,...)
  122. */
  123. 공개 함수 setVariable($arr);
  124. /*
  125. * 세션 값 가져오기
  126. * @param $key string
  127. */
  128. public function get($key="");
  129. /*
  130. * 세션 값 설정
  131. * @param $key string
  132. * @param $value string
  133. */
  134. 공용 함수 set($key="",$value ="");
  135. /*
  136. * 세션 값 설정
  137. * @param $key string
  138. * @param $value string
  139. */
  140. 공용 함수 create($key="",$value ="");
  141. /*
  142. * 세션의 유효하지 않은 시간 업데이트
  143. * @param $key string
  144. */
  145. public functionrefresh($key="");
  146. /*
  147. * mysql 또는 memcache 연결을 닫습니다.
  148. */
  149. 공용 함수 close();
  150. /*
  151. * 만료된 세션 삭제
  152. */
  153. 공용 함수 cleanup();
  154. }
  155. SessionEngine을 구현하는 최종 클래스 mysqlSessionEngine{
  156. private $id="";
  157. 비공개 $storage_name='php_session';
  158. 비공개 $storage_name_slow='php_session_slow';
  159. private $data_too_long_instead_value = '{__DATA IS ~ TO LONG__}';//데이터가 $max_session_data_length보다 길고 mysql 4 이하를 사용하는 경우 대신 이 값을 memery 테이블에 삽입하세요.
  160. 비공개 $expire_time=1200;
  161. 비공개 $max_session_data_length = 2048;
  162. 비공개 $conn;
  163. 비공개 $mysql_version;
  164. 공개 함수 mysqlSessionEngine($arr=array(),$key="",&$_conn){
  165. $this->setVariable($arr);
  166. $this->id = $key;
  167. if(empty($this->id)||strlen($this->id)!=32){
  168. throw new Exception(__FILE__."->".__LINE__.": ​​세션의 쿠키 이름은 비워둘 수 없으며 32자만 포함해야 합니다!");
  169. }
  170. $this->conn = $_conn;
  171. if(!$this->conn||!is_resource($this->conn)){
  172. throw new Exception(__FILE__."->".__LINE__.": ​​mysql 연결이 필요합니다! ");
  173. }
  174. $this->mysql_version = $this->getOne("select Floor(version())");
  175. if($this->mysql_version<5){
  176. $this->max_session_data_length = 255;
  177. }
  178. }
  179. 공용 함수 setVariable($arr){
  180. if(!empty($arr)&&is_array($arr)){
  181. foreach($arr as $k=> $v){
  182. $this->$k = $v;
  183. if($k=='storage_name'){
  184. $this->storage_name_slow = $v.'_slow';
  185. }
  186. }
  187. }
  188. }
  189. 공개 함수 get($key=""){
  190. if($key=="") $key = $this-> ID;
  191. $return = $this->getOne(''.$this->storage_name.'에서 값을 선택하세요. 여기서 id="'.$key.'"');
  192. if($return==$this->data_too_long_instead_value)
  193. {
  194. $return = $this->getOne(''.$this->storage_name_slow.'에서 값을 선택하세요. 여기서 id= "'.$key.'"');
  195. }
  196. if(!$return)
  197. {
  198. $mysqlError = mysql_error($this->conn);
  199. if(strpos($mysqlError,"존재하지 않습니다")!==false)
  200. {
  201. $this->initTable();
  202. }
  203. $return = 배열();
  204. }
  205. else
  206. {
  207. $return = unserialize($return);
  208. }
  209. return $return;
  210. }
  211. 공용 함수 close(){
  212. @mysql_close($this->conn);
  213. }
  214. 공용 함수 정리(){
  215. if($this->mysql_version>4){
  216. $sql = ''.$this->storage_name에서 삭제합니다.' 여기서 date_add(`time`,INTERVAL '.$this->expire_time.' SECOND) }else{
  217. $sql = ''.$this->storage_name_slow에서 삭제합니다.' 여기서 `time` '.$this->expire_time.' if($_SESSION['username']=="leinchu"){
  218. echo $sql;
  219. }
  220. $this->execute($sql);
  221. $sql = ''.$this->storage_name에서 삭제합니다.' 여기서 `time` '.$this->expire_time.' if($_SESSION['username']=="leinchu"){
  222. echo $sql;
  223. }
  224. }
  225. $this->execute($sql);
  226. }
  227. 공용 함수 새로 고침($key=""){
  228. if($this->mysql_version>4){
  229. $sql = '업데이트 '.$this->storage_name.' set `time`=CURRENT_TIMESTAMP() 여기서 id="'.$key.'"';
  230. }else{
  231. $sql = '업데이트 '.$this->storage_name.' set `time`=unix_timestamp() 여기서 id="'.$key.'"';
  232. }
  233. $return = $this->execute($sql);
  234. if(!$return){
  235. $this->initTable();
  236. $return = $this->execute($sql,true);
  237. }
  238. return $return;
  239. }
  240. 공개 함수 create($key="",$value=""){
  241. if($key=="") $key = $this->id;
  242. if($value != "") $value = mysql_real_escape_string(serialize($value),$this->conn);
  243. if(strlen($value)>$this->max_session_data_length)
  244. {
  245. if($this->mysql_version>4){
  246. throw new Exception(__FILE__."-> ;".__LINE__.": ​​세션 데이터가 최대 허용 길이(".$this->max_session_data_length.")!")보다 깁니다.
  247. }
  248. }
  249. if($this->mysql_version>4){
  250. $sql = ''.$this->storage_name'으로 바꿉니다. 값 설정=/''.$value.'/',id="'.$key.'",`time`=CURRENT_TIMESTAMP()';
  251. }else{
  252. $sql = ''.$this->storage_name으로 바꿉니다.' 값 설정=/''.$value.'/',id="'.$key.'",`time`=unix_timestamp()';
  253. }
  254. $return = $this->execute($sql);
  255. if(!$return){
  256. $this->initTable();
  257. $return = $this->execute($sql,true);
  258. }
  259. return $return;
  260. }
  261. 공개 함수 세트($key="",$value=""){
  262. if($key=="") $key = $this->id;
  263. if($value != "") $value = mysql_real_escape_string(serialize($value),$this->conn);
  264. $sql = ''.$this->storage_name 업데이트' 값 설정=/''.$value.'/' 여기서 id="'.$key.'"';
  265. if(strlen($value)>$this->max_session_data_length)
  266. {
  267. if($this->mysql_version>4){
  268. throw new Exception(__FILE__."-> ;".__LINE__.": ​​세션 데이터가 최대 허용 길이(".$this->max_session_data_length.")!")보다 깁니다.
  269. }
  270. $sql = ''.$this->storage_name_slow로 바꿉니다.' 값 설정=/''.$value.'/',id="'.$key.'",`time`=unix_timestamp()';
  271. $this->execute($sql,true);
  272. $sql = ''.$this->storage_name 업데이트' 값 설정=/''.$this->data_too_long_instead_value.'/' 여기서 id="'.$key.'"';
  273. }
  274. $return = $this->execute($sql);
  275. if(!$return){
  276. $this->initTable();
  277. $return = $this->execute($sql,true);
  278. }
  279. return $return;
  280. }
  281. 비공개 함수 initTable(){
  282. if($this->mysql_version>4){
  283. $sql = "
  284. 존재하지 않는 경우 CREATE TABLE `".$this-> ;storage_name."` (
  285. `id` char(32) NOT NULL 기본값 'ERR',
  286. `value` VARBINARY(".$this->max_session_data_length.") NULL,
  287. `time` 타임스탬프 NOT NULL 기본값 CURRENT_TIMESTAMP 업데이트 시 CURRENT_TIMESTAMP,
  288. PRIMARY KEY (`id`),
  289. KEY `time` (`time`)
  290. ) ENGINE=MEMORY
  291. ";
  292. }else{
  293. $sqlSlow = "
  294. 존재하지 않는 경우 CREATE TABLE `".$this->storage_name."_slow` (
  295. `id` char(32) NOT NULL 기본값 'ERR ',
  296. `value` 텍스트 NULL,
  297. `time` int(10) null이 아님 기본값 '0',
  298. PRIMARY KEY(`id`),
  299. KEY `time`(`time` )
  300. ) ENGINE=MyISAM
  301. ";
  302. $this->execute($sqlSlow,true);
  303. $sql = "
  304. 존재하지 않는 경우 CREATE TABLE `".$this->storage_name."` (
  305. `id` char(32) NOT NULL 기본값 'ERR',
  306. `value` VARCHAR(255) NULL,
  307. `time` int(10) null이 아님 기본값 '0',
  308. PRIMARY KEY(`id`),
  309. KEY `time`(`time`)
  310. ) 엔진=메모리
  311. ";
  312. }
  313. return $this->execute($sql,true);
  314. }
  315. 개인 함수 실행($sql,$die=false)
  316. {
  317. if($die)
  318. {
  319. mysql_query($sql,$this->conn) 또는 die(" exe SQL 오류:
    ".mysql_error()."
    ".$sql."
    ");
  320. }
  321. else
  322. {
  323. mysql_query($sql,$this->conn);
  324. if(mysql_error()){
  325. return false;
  326. }else{
  327. true를 반환합니다.
  328. }
  329. }
  330. }
  331. 비공개 함수 getOne($sql,$die=false){
  332. $rs = $this->query($sql,$die);
  333. if($rs && ($one = mysql_fetch_row($rs)) ){
  334. return $one[0];
  335. }else{
  336. false를 반환합니다.
  337. }
  338. }
  339. 비공개 함수 쿼리($sql,$die=false){
  340. if($die)
  341. $rs = mysql_query($sql,$this->conn) 또는 die("query Sql error:
    ".mysql_error()."
    ".$sql."
    ");
  342. else
  343. $rs = mysql_query($sql,$this->conn);
  344. $rs를 반환합니다.
  345. }
  346. }
  347. $lnk = mysql_connect('localhost', 'root', '123456')
  348. 또는 die ('연결되지 않음: ' . mysql_error());
  349. // foo를 현재 db로 만듭니다
  350. mysql_select_db('test', $lnk) 또는 die ('Can/'t use foo : ' . mysql_error());
  351. $S = 새 세션($lnk);
  352. if(!$S->last){
  353. $S->last = time();
  354. }
  355. echo "".$S->last."
    에 처음 방문했습니다.";
  356. if(!$S->lastv){
  357. $S->lastv = 0;
  358. }
  359. $S->lastv ;
  360. echo "lastv=".$S->lastv."
    ";
  361. echo "test=".$S->test."
    ";
  362. if(isset($_GET['max'])){
  363. $S->boom = str_repeat("OK",255);
  364. }
  365. if(isset($_GET['boom'])){
  366. $S->boom = $_GET['boom'];
  367. }
  368. echo "boom=".$S->boom."
    ";
  369. ?>
제제대码


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