123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- <?php
- /**
- * Created by PhpStorm.
- * User: stanley-king
- * Date: 16/1/30
- * Time: 下午3:43
- */
- class session
- {
- static $stInstance = NULL;
- private $fdestroy = false;
- private $sessid = '';
- const expire_min = 6000;
- const prefix = 'MPHPSESSID';
- const session_name = 'MPHPSESSID';
- private $expire_time;
- static public function instance()
- {
- if(self::$stInstance == NULL) {
- self::$stInstance = new session();
- }
- return self::$stInstance;
- }
- private function __construct()
- {
- }
- public function init()
- {
- session_set_save_handler(
- array(&$this,'onOpen'),
- array(&$this,'onClose'),
- array(&$this,'onRead'),
- array(&$this,'onWrite'),
- array(&$this,'onDestroy'),
- array(&$this,'onGc'));
- }
- public function start()
- {
- $this->fdestroy = false;
- session_start();
- $_SESSION['MPHPSESSID'] = $_COOKIE[self::session_name];
- }
- public function end()
- {
- // 会触发write 和 close 函数
- session_write_close();
- foreach($_SESSION as $key=>$value) {
- unset($_SESSION[$key]);
- }
- foreach($_COOKIE as $key=>$value) {
- unset($_COOKIE[$key]);
- }
- foreach($_POST as $key => $value) {
- unset($_POST[$key]);
- }
- foreach($_GET as $key => $value) {
- unset($_GET[$key]);
- }
- request_helper::clear_server();
- $this->sessid = '';
- }
- public function destroy() {
- $this->fdestroy = true;
- //session_destroy();//会触发destroy 和 close 函数
- }
- public function onOpen() {
- return true;
- }
- public function onRead($rsid)
- {
- //这段代码为了确保内置H5,直接使用客户端的session 状态。
- $sid = $_COOKIE[self::session_name];
- Log::record("MPHPSESSID = {$sid}." , Log::DEBUG);
- if(isset($_POST['HPHPSESSID']) && !empty($_POST['HPHPSESSID']))
- {
- $msid = $_POST['HPHPSESSID'];
- Log::record("HPHPSESSID = {$msid}." , Log::DEBUG);
- if($sid != $msid) {
- $sid = $msid;
- $this->set_cookie($sid);
- $_COOKIE[self::session_name] = $sid;
- }
- }
- if(empty($sid))
- {
- $ret = session_regenerate_id(false);
- if($ret == true) {
- $sid = session_id();
- $this->set_cookie($sid);
- $_COOKIE[self::session_name] = $sid;
- $this->sessid = $sid;
- } else {
- Log::record("session_regenerate_id error.",Log::ERR);
- }
- return '';
- }
- else
- {
- $data = rcache($sid,self::prefix,self::session_name);
- if(empty($data))
- {
- dcache($sid,self::prefix);
- $ret = session_regenerate_id(false);
- if($ret == true) {
- $sid = session_id();
- $this->set_cookie($sid);
- $this->sessid = $sid;
- $_COOKIE[self::session_name] = $sid;
- } else {
- Log::record("session_regenerate_id error.",Log::ERR);
- }
- return '';
- } else {
- $this->sessid = $sid;
- return $data[self::session_name];
- }
- }
- }
- public function onClose() {
- return true;
- }
- public function onWrite($sid, $data) {
- if($this->fdestroy) {
- dcache($this->sessid,self::prefix);
- } else {
- wcache($this->sessid,array(self::session_name => $data),self::prefix,self::expire_min);
- }
- return true;
- }
- public function onDestroy($sid) {
- return dcache($this->sessid,self::prefix);
- }
- public function onGc($expire) {
- return true;
- }
- private function set_cookie($sid)
- {
- $this->expire_time = time() + self::expire_min * 60;
- if(is_localdebug()) {
- fcgi_setcookie("MPHPSESSID","{$sid}",$this->expire_time,'/',LOCAL_DOMAIN);
- } else {
- fcgi_setcookie("MPHPSESSID", "{$sid}", $this->expire_time, '/', '.lrlz.com');
- }
- }
- }
|