使用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 );
|
以上所述就是本文的全部内容了,希望大家能够喜欢。