session.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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 = 'PHPSESSID';
  15. const session_name = 'PHPSESSID';
  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. }
  42. public function end()
  43. {
  44. // 会触发write 和 close 函数
  45. session_write_close();
  46. foreach($_SESSION as $key=>$value) {
  47. unset($_SESSION[$key]);
  48. }
  49. foreach($_COOKIE as $key=>$value) {
  50. unset($_COOKIE[$key]);
  51. }
  52. foreach($_POST as $key => $value) {
  53. unset($_POST[$key]);
  54. }
  55. foreach($_GET as $key => $value) {
  56. unset($_GET[$key]);
  57. }
  58. request_helper::clear_server();
  59. }
  60. public function destroy() {
  61. $this->fdestroy = true;
  62. //session_destroy();//会触发destroy 和 close 函数
  63. }
  64. public function onOpen() {
  65. return true;
  66. }
  67. public function onRead($rsid)
  68. {
  69. $sid = $_COOKIE[self::session_name];
  70. if(empty($sid))
  71. {
  72. $ret = session_regenerate_id(false);
  73. if($ret) {
  74. if(!empty($sid)) {
  75. dcache($sid,self::prefix);
  76. }
  77. $sid = session_id();
  78. $this->expire_time = time() + self::expire_min * 60;
  79. fcgi_setcookie("PHPSESSID","{$sid}",$this->expire_time);
  80. $_COOKIE[self::session_name] = $sid;
  81. $this->sessid = $sid;
  82. }
  83. return '';
  84. }
  85. else
  86. {
  87. $data = rcache($sid,self::prefix,self::session_name);
  88. if(empty($data)) {
  89. dcache($sid,self::prefix);
  90. session_regenerate_id(false);
  91. $sid = session_id();
  92. $this->expire_time = time() + self::expire_min * 60;
  93. fcgi_setcookie("PHPSESSID","{$sid}",$this->expire_time);
  94. $this->sessid = $sid;
  95. $_COOKIE[self::session_name] = $sid;
  96. return '';
  97. } else {
  98. $this->sessid = $sid;
  99. return $data[self::session_name];
  100. }
  101. }
  102. }
  103. public function onClose() {
  104. return true;
  105. }
  106. public function onWrite($sid, $data) {
  107. if($this->fdestroy) {
  108. dcache($this->sessid,self::prefix);
  109. } else {
  110. wcache($this->sessid,array(self::session_name => $data),self::prefix,self::expire_min);
  111. }
  112. return true;
  113. }
  114. public function onDestroy($sid) {
  115. return dcache($this->sessid,self::prefix);
  116. }
  117. public function onGc($expire) {
  118. return true;
  119. }
  120. }