使用session_set_save_handler()函数,将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
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
<?php /* *@author Fahy *数据库为mysql, *数据库名为session,表名为session, *表中字段包括PHPSESSID,update_time,client_ip,data */ class Session{ private static $handler = null; private static $ip = null; private static $lifetime = null; private static $time = null; //配置静态变量 private static function init( $handler ){ self:: $handler = $handler ; //获取数据库资源 self:: $ip = ! empty ( $_SERVER [ "REMOTE_ADDR" ])? $_SERVER [ "REMOTE_ADDR" ]: 'unkonw' ; //获取客户端ip self:: $lifetime = ini_get ( 'session.gc_maxlifetime' ); //获取session生命周期 self:: $time = time(); //获取当前时间 } //调用session_set_save_handler()函数并开启session static function start( $pdo ){ self::init( $pdo ); session_set_save_handler( array ( __CLASS__ , 'open' ), array ( __CLASS__ , 'close' ), array ( __CLASS__ , 'read' ), array ( __CLASS__ , 'write' ), array ( __CLASS__ , 'destroy' ), array ( __CLASS__ , 'gc' ) ); session_start(); } public static function open( $path , $name ){ return true; } public static function close(){ return true; } //查询数据库中的数据 public static function read( $PHPSESSID ){ $sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?" ; $stmt = self:: $handler ->prepare( $sql ); $stmt ->execute( array ( $PHPSESSID )); if (! $result = $stmt ->fetch(PDO::FETCH_ASSOC)){ return '' ; } if (self:: $ip == $result [ 'client_ip' ]){ self::destroy( $PHPSESSID ); return '' ; } if (( $result [ 'update_time' ]+self:: $lifetime )<self:: $time ){ self::destroy( $PHPSESSID ); return '' ; } return $result [ 'data' ]; } /* *首先查询该session是否存在数据,如果存在,则更新数据,如果不存在,则插入数据 */ //将session写入数据库中,$data传入session中的keys和values数组 public static function write( $PHPSESSID , $data ){ $sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?" ; $stmt = self:: $handler ->prepare( $sql ); $stmt ->execute( array ( $PHPSESSID )); if ( $result = $stmt ->fetch(PDO::FETCH_ASSOC)){ if ( $result [ 'data' ] != $data || self:: $time > ( $result [ 'update_time' ]+30)){ $sql = "update session set update_time=?,data=? where PHPSESSID = ?" ; $stmt = self:: $handler ->prepare( $sql ); $stmt ->execute( array ( $self :: $time , $data , $PHPSESSID )); } } else { if (! empty ( $data )){ try { $sql = "insert into session(PHPSESSID,update_time,client_ip,data) values(?,?,?,?)" ; } catch (PDOException $e ){ echo $e ->getMessage(); } $sth = self:: $handler ->prepare( $sql ); $sth ->execute( array ( $PHPSESSID ,self:: $time ,self:: $ip , $data )); } } return true; } public static function destroy( $PHPSESSID ){ $sql = "delete from session where PHPSESSID = ?" ; $stmt = self:: $handler ->prepare( $sql ); $stmt ->execute( array ( $PHPSESSID )); return true; } public static function gc( $lifetime ){ $sql = "delete from session where update_time<?" ; $stmt = self:: $handler ->prepare( $sql ); $stmt ->execute( array (self:: $time - $lifetime )); return true; } } //使用PDO连接数据库 try { $pdo = new PDO( "mysql:host=localhost;dbname=session" , "root" , "hwj193" ); } catch (PDOException $e ){ echo $e ->getMessage(); } //传递数据库资源 Session::start( $pdo ); |
以上所述就是本文的全部内容了,希望大家能够喜欢。