session.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 16/1/30
  6. * Time: 下午3:43
  7. */
  8. class session
  9. {
  10. static $stInstance = NULL;
  11. private $fdestroy = false;
  12. private $sessid = '';
  13. const expire_min = 6000;
  14. const prefix = 'MPHPSESSID';
  15. const session_name = 'MPHPSESSID';
  16. private $expire_time;
  17. static public function instance()
  18. {
  19. if(self::$stInstance == NULL) {
  20. self::$stInstance = new session();
  21. }
  22. return self::$stInstance;
  23. }
  24. private function __construct()
  25. {
  26. }
  27. public function init()
  28. {
  29. session_set_save_handler(
  30. array(&$this,'onOpen'),
  31. array(&$this,'onClose'),
  32. array(&$this,'onRead'),
  33. array(&$this,'onWrite'),
  34. array(&$this,'onDestroy'),
  35. array(&$this,'onGc'));
  36. }
  37. public function start()
  38. {
  39. $this->fdestroy = false;
  40. session_start();
  41. $_SESSION['MPHPSESSID'] = $_COOKIE[self::session_name];
  42. }
  43. public function end()
  44. {
  45. // 会触发write 和 close 函数
  46. session_write_close();
  47. foreach($_SESSION as $key=>$value) {
  48. unset($_SESSION[$key]);
  49. }
  50. foreach($_COOKIE as $key=>$value) {
  51. unset($_COOKIE[$key]);
  52. }
  53. foreach($_POST as $key => $value) {
  54. unset($_POST[$key]);
  55. }
  56. foreach($_GET as $key => $value) {
  57. unset($_GET[$key]);
  58. }
  59. request_helper::clear_server();
  60. $this->sessid = '';
  61. }
  62. public function destroy() {
  63. $this->fdestroy = true;
  64. //session_destroy();//会触发destroy 和 close 函数
  65. }
  66. public function onOpen() {
  67. return true;
  68. }
  69. public function onRead($rsid)
  70. {
  71. //这段代码为了确保内置H5,直接使用客户端的session 状态。
  72. $sid = $_COOKIE[self::session_name];
  73. Log::record("MPHPSESSID = {$sid}." , Log::DEBUG);
  74. if(isset($_POST['HPHPSESSID']) && !empty($_POST['HPHPSESSID']))
  75. {
  76. $msid = $_POST['HPHPSESSID'];
  77. Log::record("HPHPSESSID = {$msid}." , Log::DEBUG);
  78. if($sid != $msid) {
  79. $sid = $msid;
  80. $this->set_cookie($sid);
  81. $_COOKIE[self::session_name] = $sid;
  82. }
  83. }
  84. if(empty($sid))
  85. {
  86. $ret = session_regenerate_id(false);
  87. if($ret == true) {
  88. $sid = session_id();
  89. $this->set_cookie($sid);
  90. $_COOKIE[self::session_name] = $sid;
  91. $this->sessid = $sid;
  92. } else {
  93. Log::record("session_regenerate_id error.",Log::ERR);
  94. }
  95. return '';
  96. }
  97. else
  98. {
  99. $data = rcache($sid,self::prefix,self::session_name);
  100. if(empty($data))
  101. {
  102. dcache($sid,self::prefix);
  103. $ret = session_regenerate_id(false);
  104. if($ret == true) {
  105. $sid = session_id();
  106. $this->set_cookie($sid);
  107. $this->sessid = $sid;
  108. $_COOKIE[self::session_name] = $sid;
  109. } else {
  110. Log::record("session_regenerate_id error.",Log::ERR);
  111. }
  112. return '';
  113. } else {
  114. $this->sessid = $sid;
  115. return $data[self::session_name];
  116. }
  117. }
  118. }
  119. public function onClose() {
  120. return true;
  121. }
  122. public function onWrite($sid, $data) {
  123. if($this->fdestroy) {
  124. dcache($this->sessid,self::prefix);
  125. } else {
  126. wcache($this->sessid,array(self::session_name => $data),self::prefix,self::expire_min);
  127. }
  128. return true;
  129. }
  130. public function onDestroy($sid) {
  131. return dcache($this->sessid,self::prefix);
  132. }
  133. public function onGc($expire) {
  134. return true;
  135. }
  136. private function set_cookie($sid)
  137. {
  138. $this->expire_time = time() + self::expire_min * 60;
  139. if(is_localdebug()) {
  140. fcgi_setcookie("MPHPSESSID","{$sid}",$this->expire_time,'/',LOCAL_DOMAIN);
  141. } else {
  142. fcgi_setcookie("MPHPSESSID", "{$sid}", $this->expire_time, '/', '.lrlz.com');
  143. }
  144. }
  145. }