对于大访问量的站点使用默认的Session 并不合适,我们可以将其存入数据库、或者使用Redis KEY-VALUE数据存储方案
首先新建一个session表
1
2
3
4
5
6
|
CREATE TABLE `sessions` ( `sid` char (40) NOT NULL , `updatetime` int (20) NOT NULL , `data` varchar (200) NOT NULL , UNIQUE KEY `sid` (`sid`) USING HASH ) ENGINE=MEMORY DEFAULT CHARSET=utf8; |
Mysql 的memory引擎采用内存表,所有数据存储在内存,操作速度快
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
<?php //引入数据库文件 include "db.php" ; class MySessionHandler implements SessionHandlerInterface { private $savePath ; private $sessData ; public $expiretime ; //设置过期时间 public $db ; //数据库 public function __construct( $hanlder = '' ){ $this ->db = Database::getInstance(); //获取数据库实力 ///var_dump($this->db); } public function open( $savePath , $sessionName ) { return true; } public function close() { return true; } public function read( $id ) { $sql = "select * from sessions where sid ='$id'" ; $result = $this ->db->execute( $sql ); if (! empty ( $result )){ return $this ->sessData = $result ; } } //函数的参数 $id -> 当前会话ID //数据DATA -> 序列化之后的字符串 public function write( $id , $data ) { // echo $id; // echo $data; $now = time(); $newExp = $now + $this ->expiretime; //总时间=当前时间 + 期限时间 $sql = "select * from sessions where sid ='$id'" ; $result = $this ->db->getOne( $sql ); //var_dump($result); if ( $data == '' ||isset( $data )){ $data = $this ->sessData; } if ( $result ){ //如果存在则更新 $sql = "update sessions set updatetime = '$newExp',data ='$data' where sid = '$id'" ; //echo $sql; $update_data = $this ->db->execute( $sql ); if ( $update_data ){ return true; } } else { //不存在则生成生成 $sql = "insert into sessions(sid,updatetime,data) values('$id','$now','$data')" ; $insert_data = $this ->db->execute( $sql ); if ( $insert_data ){ return true; } } return false; } public function destroy( $id ) { //销毁 $sql = "delete from sessions where sid=" . "$id" ; $destory = $this ->db->execute( $sql ); if ( $destory ){ return true; } else { return false; } } public function gc( $sessMaxLifeTime ) { $t = time(); $sql = "delete from sessions where $t - 'updatetime'>${sessMaxLifeTime}" ; $data = $this ->db->execute( $this ->tosql); if ( $data ){ return true; } else { return false; } return true; } } |
实例化
此处 PHP 手册可以有两种方法
1,实现了SessionHandlerInterface借口的对象,自PHP5.4可以使用
2 ,直接使用 session_set_save_handler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//判断PHP版本 if (version_compare(PHP_VERSION,5.4)==1){ session_set_save_handler( $handler , true); session_start(); } else { ini_set ( 'session.use_trans_sid' ,0); ini_set ( 'session.use_cookies' ,1); ini_set ( 'session.cookie_path' , '/' ); ini_set ( 'session.save_handler' , 'user' ); session_module_name( 'user' ); session_set_save_handler( array ( $session , "open" ), array ( $session , "close" ), array ( $session , "read" ), array ( $session , "write" ), array ( $session , "destory" ), array ( $session , "gc" )); session_start(); } $_SESSION [ 'QQ' ]= "QQ" ; echo $_SESSION [ 'QQ' ]; |
数据库代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?php class Database{ static $instance ; static $db ; static function getInstance(){ if (self:: $instance ){ return self:: $instance ; } else { return new Database(); } } public function __construct(){ self:: $db = new PDO( 'mysql:host=localhost;dbname=session' , 'root' , '' ); } public function getOne( $sql ){ $rs =self:: $db ->query( $sql ); @ $rs ->setFetchMode(PDO::FETCH_ASSOC); //返回关联数组 $result = $rs -> fetch(); return $result ; } public function execute( $sql ){ $rs = self:: $db -> exec ( $sql ); return $rs ; } } //$data = Database::getInstance(); //var_dump($data); |
使用REDIS 存储SESSION
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
<?php class SessionManager{ private $redis ; private $sessionSavePath ; private $sessionName ; private $sessionExpireTime = 30; public function __construct(){ $this ->redis = new Redis(); $this ->redis->connect( '127.0.0.1' ,6379); //连接redis $retval = session_set_save_handler( array ( $this , "open" ), array ( $this , "close" ), array ( $this , "read" ), array ( $this , "write" ), array ( $this , "destory" ), array ( $this , "gc" ) ); session_start(); } public function open( $path , $name ){ return true; } public function close(){ return true; } public function read( $id ){ $value = $this ->redis->get( $id ); if ( $value ){ return $value ; } else { return "" ; } } public function write( $id , $data ){ if ( $this ->redis->set( $id , $data )){ $this ->redis->expire( $id , $this ->sessionExpireTime); //设置过期时间 return true; } return false; } public function destory( $id ){ if ( $this ->redis-> delete ( $id )){ return true; } return false; } public function gc( $maxlifetime ){ return true; } //析构函数 public function __destruct(){ session_write_close(); } } $re = new SessionManager(); $_SESSION [ 'name' ] = "qq" ; echo $_SESSION [ 'name' ]; |
以上就是详细的介绍了php实现Session存储到Redis的方法,希望对大家的学习有所帮助。