-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSessionManager.php
256 lines (231 loc) · 4.8 KB
/
SessionManager.php
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
<?php
/**
* slince session component
*
* session组件是对session管理的抽象
* 组件所有对session的设置都不会持久化到ini文件中
* 同样组件对ini文件的读取是懒惰的;如果客户端没有主动
* 修改session运行参数;组件不会主动从ini中读取默认参数
*
* @author Tao <[email protected]>
*/
namespace Slince\Session;
use Slince\Session\Exception\SessionException;
use Slince\Session\Storage\StorageInterface;
use Slince\Session\Bridge\BridgeInterface;
class SessionManager
{
/**
* storage
*
* @var \StorageInterface
*/
protected $storage;
/**
* 传递中介
*
* @var BridgeInterface
*/
protected $bridge;
/**
* session id
*
* @var string
*/
protected $id;
/**
* session name
*
* @var string
*/
protected $name;
/**
* gc时间
*
* @var int
*/
protected $gcMaxLifeTime;
/**
* 是否已经启动
*
* @var boolean
*/
protected $started = false;
function __construct(StorageInterface $storage = null, BridgeInterface $bridge = null)
{
if (!is_null($storage)) {
$this->setStorage($storage);
}
if (!is_null($bridge)) {
$this->setBridge($bridge);
}
}
function setStorage(StorageInterface $storage)
{
if ($this->isStarted()) {
$this->destroy();
}
$this->storage = $storage;
}
function setBridge(BridgeInterface $bridge)
{
$this->bridge = $bridge;
}
/**
* 启动或者重用会话
*/
function start()
{
if (! $this->isStarted()) {
$this->initialize();
session_start();
$this->started = true;
}
}
/**
* 启动前调用
*/
protected function initialize()
{
// 初始化桥配置
if (!is_null($this->bridge)) {
$this->bridge->initialize($this);
}
// 初始化存储接口
if (!is_null($this->storage)) {
$this->storage->initialize($this);
}
// 设置session id;如果设置了id则不会再生成session文件
if (!is_null($this->id)) {
session_id($this->id);
}
// 自定义session;name
if (!is_null($this->name)) {
session_name($this->name);
}
}
/**
* 是否已经启动session
* @return boolean
*/
function isStarted()
{
return $this->started || $this->getStatus() == PHP_SESSION_ACTIVE;
}
/**
* 获取session存储参数
* @return Repository
*/
function getRepository()
{
return new Repository($this);
}
/**
* 获取会话状态
*
* @return boolean
*/
function getStatus()
{
return session_status();
}
/**
* 删除已注册的所有变量
*
* @return void
*/
function clear()
{
session_unset();
}
/**
* 销毁会话
*
* @return boolean
*/
function destroy()
{
// 已经启动才能销毁
if ($this->isStarted()) {
session_destroy();
}
$_SESSION = [];
$this->started = false;
}
/**
* 重新生成id
*
* @return boolean
*/
function regenerateId()
{
if (! $this->isStarted()) {
$this->start();
}
return session_regenerate_id();
}
/**
* 读取会话名称
*/
function getName()
{
return is_null($this->name) ? session_name() : $this->name;
}
/**
* 设置名称
*
* @param string $name
* @throws SessionException
* @return string
*/
function setName($name)
{
if (!preg_match("/[A-z]/", $name)) {
throw new SessionException('Session name contains at least one letter');
}
// session已经启动则销毁当前会话
$this->destroy();
return $this->name = $name;
}
/**
* 读取id
*
* @return string
*/
function getId()
{
return is_null($this->id) ? session_id() : $this->id;
}
/**
* 设置id
*
* @param unknown $id
* @return string
*/
function setId($id)
{
$this->destroy();
return $this->id = $id;
}
/**
* 获取gc周期
*
* @return int
*/
function getGcMaxLifeTime()
{
if (is_null($this->gcMaxLifeTime)) {
$this->gcMaxLifeTime = intval(ini_get('session.gc_maxlifetime'));
}
return $this->gcMaxLifeTime;
}
/**
* 写入值,session结束前调用
*
* @return void
*/
function commit()
{
return session_commit();
}
}