SessionHandler.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Fanwe 方维直播系统
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2011 http://www.fanwe.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Author: 云淡风轻(1956838968@qq.com)
  8. // session 管理控制器
  9. // +----------------------------------------------------------------------
  10. class SessionHandler
  11. {
  12. private $savePath;
  13. private $mem; //Memcache使用
  14. private $db; //数据库使用
  15. private $table; //数据库使用
  16. function open($savePath, $sessionName)
  17. {
  18. $this->savePath = APP_ROOT_PATH."public/session";
  19. if($GLOBALS['distribution_cfg']['SESSION_TYPE']=="MemcacheSASL")
  20. {
  21. $this->mem = require_once APP_ROOT_PATH."system/cache/MemcacheSASL/MemcacheSASL.php";
  22. $this->mem = new MemcacheSASL;
  23. $this->mem->addServer($GLOBALS['distribution_cfg']['SESSION_CLIENT'], $GLOBALS['distribution_cfg']['SESSION_PORT']);
  24. $this->mem->setSaslAuthData($GLOBALS['distribution_cfg']['SESSION_USERNAME'],$GLOBALS['distribution_cfg']['SESSION_PASSWORD']);
  25. }
  26. elseif($GLOBALS['distribution_cfg']['SESSION_TYPE']=="Db")
  27. {
  28. $pconnect = false;
  29. $session_client = $GLOBALS['distribution_cfg']['SESSION_CLIENT']==""?app_conf('DB_HOST'):$GLOBALS['distribution_cfg']['SESSION_CLIENT'];
  30. $session_port = $GLOBALS['distribution_cfg']['SESSION_PORT']==""?app_conf('DB_PORT'):$GLOBALS['distribution_cfg']['SESSION_PORT'];
  31. $session_username = $GLOBALS['distribution_cfg']['SESSION_USERNAME']==""?app_conf('DB_USER'):$GLOBALS['distribution_cfg']['SESSION_USERNAME'];
  32. $session_password = $GLOBALS['distribution_cfg']['SESSION_PASSWORD']==""?app_conf('DB_PWD'):$GLOBALS['distribution_cfg']['SESSION_PASSWORD'];
  33. $session_db = $GLOBALS['distribution_cfg']['SESSION_DB']==""?app_conf('DB_NAME'):$GLOBALS['distribution_cfg']['SESSION_DB'];
  34. $this->db = new mysql_db($session_client.":".$session_port, $session_username,$session_password,$session_db,'utf8',$pconnect);
  35. $this->table = $GLOBALS['distribution_cfg']['SESSION_TABLE']==""?DB_PREFIX."session":$GLOBALS['distribution_cfg']['SESSION_TABLE'];
  36. }
  37. else
  38. {
  39. if (!is_dir($this->savePath)) {
  40. @mkdir($this->savePath, 0777);
  41. }
  42. }
  43. return true;
  44. }
  45. function close()
  46. {
  47. return true;
  48. }
  49. function read($id)
  50. {
  51. $sess_id = "sess_".$id;
  52. if($GLOBALS['distribution_cfg']['SESSION_TYPE']=="MemcacheSASL")
  53. {
  54. return $this->mem->get("$this->savePath/$sess_id");
  55. }
  56. elseif($GLOBALS['distribution_cfg']['SESSION_TYPE']=="Db")
  57. {
  58. $session_data = $this->db->getRow("select session_data,session_time from ".$this->table." where session_id = '".$sess_id."'",true);
  59. if($session_data['session_time']<NOW_TIME)
  60. {
  61. return false;
  62. }
  63. else
  64. {
  65. return $session_data['session_data'];
  66. }
  67. }
  68. else
  69. {
  70. $file = "$this->savePath/$sess_id";
  71. if (filemtime($file) + $GLOBALS['distribution_cfg']['SESSION_TIME'] < time() && file_exists($file)) {
  72. @unlink($file);
  73. }
  74. $data = (string)@file_get_contents($file);
  75. return $data;
  76. }
  77. }
  78. function write($id, $data)
  79. {
  80. $sess_id = "sess_".$id;
  81. if($GLOBALS['distribution_cfg']['SESSION_TYPE']=="MemcacheSASL")
  82. {
  83. return $this->mem->set("$this->savePath/$sess_id",$data,$GLOBALS['distribution_cfg']['SESSION_TIME']);
  84. }
  85. elseif($GLOBALS['distribution_cfg']['SESSION_TYPE']=="Db")
  86. {
  87. $session_data = $this->db->getRow("select session_data,session_time from ".$this->table." where session_id = '".$sess_id."'",true);
  88. if($session_data)
  89. {
  90. $session_data['session_data'] = $data;
  91. $session_data['session_time'] = NOW_TIME+$GLOBALS['distribution_cfg']['SESSION_TIME'];
  92. $this->db->autoExecute($this->table, $session_data,"UPDATE","session_id = '".$sess_id."'");
  93. }
  94. else
  95. {
  96. $session_data['session_id'] = $sess_id;
  97. $session_data['session_data'] = $data;
  98. $session_data['session_time'] = NOW_TIME+$GLOBALS['distribution_cfg']['SESSION_TIME'];
  99. $this->db->autoExecute($this->table, $session_data);
  100. }
  101. return true;
  102. }
  103. else
  104. {
  105. return file_put_contents("$this->savePath/$sess_id", $data) === false ? false : true;
  106. }
  107. }
  108. function destroy($id)
  109. {
  110. $sess_id = "sess_".$id;
  111. if($GLOBALS['distribution_cfg']['SESSION_TYPE']=="MemcacheSASL")
  112. {
  113. $this->mem->delete($sess_id);
  114. }
  115. elseif($GLOBALS['distribution_cfg']['SESSION_TYPE']=="Db")
  116. {
  117. $this->db->query("delete from ".$this->table." where session_id = '".$sess_id."'");
  118. }
  119. else
  120. {
  121. $file = "$this->savePath/$sess_id";
  122. if (file_exists($file)) {
  123. @unlink($file);
  124. }
  125. }
  126. return true;
  127. }
  128. function gc($maxlifetime)
  129. {
  130. if($GLOBALS['distribution_cfg']['SESSION_TYPE']=="MemcacheSASL")
  131. {
  132. }
  133. elseif($GLOBALS['distribution_cfg']['SESSION_TYPE']=="Db")
  134. {
  135. $this->db->query("delete from ".$this->table." where session_time < ".NOW_TIME);
  136. }
  137. else
  138. {
  139. foreach (glob("$this->savePath/sess_*") as $file) {
  140. if (filemtime($file) + $GLOBALS['distribution_cfg']['SESSION_TIME'] < time() && file_exists($file)) {
  141. unlink($file);
  142. }
  143. }
  144. }
  145. return true;
  146. }
  147. }
  148. ?>