PageRenderTime 45ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/ThinkPHP/Library/Think/Session/Driver/Db.class.php

https://gitlab.com/Red54/thinkphp
PHP | 193 lines | 112 code | 17 blank | 64 comment | 16 complexity | e25690262a169d5fa7d8caae3915f3e3 MD5 | raw file
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. namespace Think\Session\Driver;
  12. /**
  13. * 数据库方式Session驱动
  14. * CREATE TABLE think_session (
  15. * session_id varchar(255) NOT NULL,
  16. * session_expire int(11) NOT NULL,
  17. * session_data blob,
  18. * UNIQUE KEY `session_id` (`session_id`)
  19. * );
  20. */
  21. class Db
  22. {
  23. /**
  24. * Session有效时间
  25. */
  26. protected $lifeTime = '';
  27. /**
  28. * session保存的数据库名
  29. */
  30. protected $sessionTable = '';
  31. /**
  32. * 数据库句柄
  33. */
  34. protected $hander = array();
  35. /**
  36. * 打开Session
  37. * @access public
  38. * @param string $savePath
  39. * @param mixed $sessName
  40. */
  41. public function open($savePath, $sessName)
  42. {
  43. $this->lifeTime = C('SESSION_EXPIRE') ? C('SESSION_EXPIRE') : ini_get('session.gc_maxlifetime');
  44. $this->sessionTable = C('SESSION_TABLE') ? C('SESSION_TABLE') : C("DB_PREFIX") . "session";
  45. //分布式数据库
  46. $host = explode(',', C('DB_HOST'));
  47. $port = explode(',', C('DB_PORT'));
  48. $name = explode(',', C('DB_NAME'));
  49. $user = explode(',', C('DB_USER'));
  50. $pwd = explode(',', C('DB_PWD'));
  51. if (1 == C('DB_DEPLOY_TYPE')) {
  52. //读写分离
  53. if (C('DB_RW_SEPARATE')) {
  54. $w = floor(mt_rand(0, C('DB_MASTER_NUM') - 1));
  55. if (is_numeric(C('DB_SLAVE_NO'))) {
  56. //指定服务器读
  57. $r = C('DB_SLAVE_NO');
  58. } else {
  59. $r = floor(mt_rand(C('DB_MASTER_NUM'), count($host) - 1));
  60. }
  61. //主数据库链接
  62. $hander = mysql_connect(
  63. $host[$w] . (isset($port[$w]) ? ':' . $port[$w] : ':' . $port[0]),
  64. isset($user[$w]) ? $user[$w] : $user[0],
  65. isset($pwd[$w]) ? $pwd[$w] : $pwd[0]
  66. );
  67. $dbSel = mysql_select_db(
  68. isset($name[$w]) ? $name[$w] : $name[0]
  69. , $hander);
  70. if (!$hander || !$dbSel) {
  71. return false;
  72. }
  73. $this->hander[0] = $hander;
  74. //从数据库链接
  75. $hander = mysql_connect(
  76. $host[$r] . (isset($port[$r]) ? ':' . $port[$r] : ':' . $port[0]),
  77. isset($user[$r]) ? $user[$r] : $user[0],
  78. isset($pwd[$r]) ? $pwd[$r] : $pwd[0]
  79. );
  80. $dbSel = mysql_select_db(
  81. isset($name[$r]) ? $name[$r] : $name[0]
  82. , $hander);
  83. if (!$hander || !$dbSel) {
  84. return false;
  85. }
  86. $this->hander[1] = $hander;
  87. return true;
  88. }
  89. }
  90. //从数据库链接
  91. $r = floor(mt_rand(0, count($host) - 1));
  92. $hander = mysql_connect(
  93. $host[$r] . (isset($port[$r]) ? ':' . $port[$r] : ':' . $port[0]),
  94. isset($user[$r]) ? $user[$r] : $user[0],
  95. isset($pwd[$r]) ? $pwd[$r] : $pwd[0]
  96. );
  97. $dbSel = mysql_select_db(
  98. isset($name[$r]) ? $name[$r] : $name[0]
  99. , $hander);
  100. if (!$hander || !$dbSel) {
  101. return false;
  102. }
  103. $this->hander = $hander;
  104. return true;
  105. }
  106. /**
  107. * 关闭Session
  108. * @access public
  109. */
  110. public function close()
  111. {
  112. if (is_array($this->hander)) {
  113. $this->gc($this->lifeTime);
  114. return (mysql_close($this->hander[0]) && mysql_close($this->hander[1]));
  115. }
  116. $this->gc($this->lifeTime);
  117. return mysql_close($this->hander);
  118. }
  119. /**
  120. * 读取Session
  121. * @access public
  122. * @param string $sessID
  123. */
  124. public function read($sessID)
  125. {
  126. $hander = is_array($this->hander) ? $this->hander[1] : $this->hander;
  127. $res = mysql_query('SELECT session_data AS data FROM ' . $this->sessionTable . " WHERE session_id = '$sessID' AND session_expire >" . time(), $hander);
  128. if ($res) {
  129. $row = mysql_fetch_assoc($res);
  130. return $row['data'];
  131. }
  132. return "";
  133. }
  134. /**
  135. * 写入Session
  136. * @access public
  137. * @param string $sessID
  138. * @param String $sessData
  139. */
  140. public function write($sessID, $sessData)
  141. {
  142. $hander = is_array($this->hander) ? $this->hander[0] : $this->hander;
  143. $expire = time() + $this->lifeTime;
  144. $sessData = addslashes($sessData);
  145. mysql_query('REPLACE INTO ' . $this->sessionTable . " ( session_id, session_expire, session_data) VALUES( '$sessID', '$expire', '$sessData')", $hander);
  146. if (mysql_affected_rows($hander)) {
  147. return true;
  148. }
  149. return false;
  150. }
  151. /**
  152. * 删除Session
  153. * @access public
  154. * @param string $sessID
  155. */
  156. public function destroy($sessID)
  157. {
  158. $hander = is_array($this->hander) ? $this->hander[0] : $this->hander;
  159. mysql_query('DELETE FROM ' . $this->sessionTable . " WHERE session_id = '$sessID'", $hander);
  160. if (mysql_affected_rows($hander)) {
  161. return true;
  162. }
  163. return false;
  164. }
  165. /**
  166. * Session 垃圾回收
  167. * @access public
  168. * @param string $sessMaxLifeTime
  169. */
  170. public function gc($sessMaxLifeTime)
  171. {
  172. $hander = is_array($this->hander) ? $this->hander[0] : $this->hander;
  173. mysql_query('DELETE FROM ' . $this->sessionTable . ' WHERE session_expire < ' . time(), $hander);
  174. return mysql_affected_rows($hander);
  175. }
  176. }