Mysqli.class.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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: hainuo<admin@hainuo.info> liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. // | change mysql to mysqli 解决php7没有mysql扩展时数据库存放session无法操作的问题
  12. // +----------------------------------------------------------------------
  13. namespace Think\Session\Driver;
  14. /**
  15. * 数据库方式Session驱动
  16. * CREATE TABLE think_session (
  17. * session_id varchar(255) NOT NULL,
  18. * session_expire int(11) NOT NULL,
  19. * session_data blob,
  20. * UNIQUE KEY `session_id` (`session_id`)
  21. * );
  22. */
  23. class Mysqli
  24. {
  25. /**
  26. * Session有效时间
  27. */
  28. protected $lifeTime = '';
  29. /**
  30. * session保存的数据库名
  31. */
  32. protected $sessionTable = '';
  33. /**
  34. * 数据库句柄
  35. */
  36. protected $hander = array();
  37. /**
  38. * 打开Session
  39. * @access public
  40. * @param string $savePath
  41. * @param mixed $sessName
  42. */
  43. public function open($savePath, $sessName)
  44. {
  45. $this->lifeTime = C('SESSION_EXPIRE') ? C('SESSION_EXPIRE') : ini_get('session.gc_maxlifetime');
  46. $this->sessionTable = C('SESSION_TABLE') ? C('SESSION_TABLE') : C("DB_PREFIX") . "session";
  47. //分布式数据库
  48. $host = explode(',', C('DB_HOST'));
  49. $port = explode(',', C('DB_PORT'));
  50. $name = explode(',', C('DB_NAME'));
  51. $user = explode(',', C('DB_USER'));
  52. $pwd = explode(',', C('DB_PWD'));
  53. if (1 == C('DB_DEPLOY_TYPE')) {
  54. //读写分离
  55. if (C('DB_RW_SEPARATE')) {
  56. $w = floor(mt_rand(0, C('DB_MASTER_NUM') - 1));
  57. if (is_numeric(C('DB_SLAVE_NO'))) {
  58. //指定服务器读
  59. $r = C('DB_SLAVE_NO');
  60. } else {
  61. $r = floor(mt_rand(C('DB_MASTER_NUM'), count($host) - 1));
  62. }
  63. //主数据库链接
  64. $hander = mysqli_connect(
  65. $host[$w] . (isset($port[$w]) ? ':' . $port[$w] : ':' . $port[0]),
  66. isset($user[$w]) ? $user[$w] : $user[0],
  67. isset($pwd[$w]) ? $pwd[$w] : $pwd[0]
  68. );
  69. $dbSel = mysqli_select_db(
  70. $hander,
  71. isset($name[$w]) ? $name[$w] : $name[0]
  72. );
  73. if (!$hander || !$dbSel) {
  74. return false;
  75. }
  76. $this->hander[0] = $hander;
  77. //从数据库链接
  78. $hander = mysqli_connect(
  79. $host[$r] . (isset($port[$r]) ? ':' . $port[$r] : ':' . $port[0]),
  80. isset($user[$r]) ? $user[$r] : $user[0],
  81. isset($pwd[$r]) ? $pwd[$r] : $pwd[0]
  82. );
  83. $dbSel = mysqli_select_db(
  84. $hander,
  85. isset($name[$r]) ? $name[$r] : $name[0]
  86. );
  87. if (!$hander || !$dbSel) {
  88. return false;
  89. }
  90. $this->hander[1] = $hander;
  91. return true;
  92. }
  93. }
  94. //从数据库链接
  95. $r = floor(mt_rand(0, count($host) - 1));
  96. $hander = mysqli_connect(
  97. $host[$r] . (isset($port[$r]) ? ':' . $port[$r] : ':' . $port[0]),
  98. isset($user[$r]) ? $user[$r] : $user[0],
  99. isset($pwd[$r]) ? $pwd[$r] : $pwd[0]
  100. );
  101. $dbSel = mysqli_select_db(
  102. $hander,
  103. isset($name[$r]) ? $name[$r] : $name[0]
  104. );
  105. if (!$hander || !$dbSel) {
  106. return false;
  107. }
  108. $this->hander = $hander;
  109. return true;
  110. }
  111. /**
  112. * 关闭Session
  113. * @access public
  114. */
  115. public function close()
  116. {
  117. if (is_array($this->hander)) {
  118. $this->gc($this->lifeTime);
  119. return (mysqli_close($this->hander[0]) && mysqli_close($this->hander[1]));
  120. }
  121. $this->gc($this->lifeTime);
  122. return mysqli_close($this->hander);
  123. }
  124. /**
  125. * 读取Session
  126. * @access public
  127. * @param string $sessID
  128. */
  129. public function read($sessID)
  130. {
  131. $hander = is_array($this->hander) ? $this->hander[1] : $this->hander;
  132. $res = mysqli_query($hander, "SELECT session_data AS data FROM " . $this->sessionTable . " WHERE session_id = '$sessID' AND session_expire >" . time());
  133. if ($res) {
  134. $row = mysqli_fetch_assoc($res);
  135. return $row['data'];
  136. }
  137. return "";
  138. }
  139. /**
  140. * 写入Session
  141. * @access public
  142. * @param string $sessID
  143. * @param String $sessData
  144. */
  145. public function write($sessID, $sessData)
  146. {
  147. $hander = is_array($this->hander) ? $this->hander[0] : $this->hander;
  148. $expire = time() + $this->lifeTime;
  149. mysqli_query($hander, "REPLACE INTO " . $this->sessionTable . " ( session_id, session_expire, session_data) VALUES( '$sessID', '$expire', '$sessData')");
  150. if (mysqli_affected_rows($hander)) {
  151. return true;
  152. }
  153. return false;
  154. }
  155. /**
  156. * 删除Session
  157. * @access public
  158. * @param string $sessID
  159. */
  160. public function destroy($sessID)
  161. {
  162. $hander = is_array($this->hander) ? $this->hander[0] : $this->hander;
  163. mysqli_query($hander, "DELETE FROM " . $this->sessionTable . " WHERE session_id = '$sessID'");
  164. if (mysqli_affected_rows($hander)) {
  165. return true;
  166. }
  167. return false;
  168. }
  169. /**
  170. * Session 垃圾回收
  171. * @access public
  172. * @param string $sessMaxLifeTime
  173. */
  174. public function gc($sessMaxLifeTime)
  175. {
  176. $hander = is_array($this->hander) ? $this->hander[0] : $this->hander;
  177. mysqli_query($hander, "DELETE FROM " . $this->sessionTable . " WHERE session_expire < " . time());
  178. return mysqli_affected_rows($hander);
  179. }
  180. }