php5.5 session,(五)ThinkPHP实践之Session驱动-TTLSA
Session驅(qū)動(dòng)是指Session在thinkphp中的存儲(chǔ)驅(qū)動(dòng),通過(guò)不同的方式,可以將Session存儲(chǔ)在不同的“容器”中
對(duì)Session有興趣的的朋友可以查閱相關(guān)資料,本篇僅針對(duì)thinkphp的session驅(qū)動(dòng)進(jìn)行講解
一、DB驅(qū)動(dòng)
知識(shí)點(diǎn):
1、thinkphp框架默認(rèn)DB驅(qū)動(dòng)調(diào)用
2、SessionDB驅(qū)動(dòng)庫(kù)調(diào)用詳解
3、創(chuàng)建DB驅(qū)動(dòng)數(shù)據(jù)表tb_session
4、驗(yàn)證session自動(dòng)生成
1、thinkphp框架默認(rèn)DB驅(qū)動(dòng)調(diào)用
如果在不設(shè)置任何驅(qū)動(dòng)的情況下,windows會(huì)存儲(chǔ)在wamp/tmp/目錄下,linux會(huì)存儲(chǔ)在/tmp/目錄下,文件名都以"sess_"為前綴
其實(shí)說(shuō)調(diào)用只是讓DB類生效,作為Session的默認(rèn)存儲(chǔ)方式
配置方法是在message/admin/Conf/config.php文件中加入
'SESSION_TYPE' => 'Db',
1
'SESSION_TYPE'=>'Db',
即可,這樣DB驅(qū)動(dòng)就配置完成了
2、SessionDB驅(qū)動(dòng)庫(kù)調(diào)用詳解
很多朋友估計(jì)跟我一樣,配置完了發(fā)現(xiàn)自己好像什么都沒(méi)明白,于是就要挖根究底,找到了調(diào)用DB驅(qū)動(dòng)類的方法
首先找到框架默認(rèn)函數(shù)文件在ThinkPHP框架目錄下Common/functions.php
找到session管理函數(shù)段
重點(diǎn)代碼如下:
//以下內(nèi)容就是查找驅(qū)動(dòng)類的判斷
if(C('SESSION_TYPE')) { // 讀取session驅(qū)動(dòng)
//我們?cè)O(shè)置的是Db類型
$class = 'Session'. ucwords(strtolower(C('SESSION_TYPE')));
//$class在這里經(jīng)過(guò)處理最終為SessionDb
// 檢查驅(qū)動(dòng)類
if(require_cache(EXTEND_PATH.'Driver/Session/'.$class.'.class.php')) {
//這個(gè)判斷會(huì)找到Extend/Driver/Session/SessionDb.class.php
$hander = new $class();
$hander->execute();
}else {
// 類沒(méi)有定義
throw_exception(L('_CLASS_NOT_EXIST_').': ' . $class);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//以下內(nèi)容就是查找驅(qū)動(dòng)類的判斷
if(C('SESSION_TYPE')){// 讀取session驅(qū)動(dòng)
//我們?cè)O(shè)置的是Db類型
$class='Session'.ucwords(strtolower(C('SESSION_TYPE')));
//$class在這里經(jīng)過(guò)處理最終為SessionDb
// 檢查驅(qū)動(dòng)類
if(require_cache(EXTEND_PATH.'Driver/Session/'.$class.'.class.php')){
//這個(gè)判斷會(huì)找到Extend/Driver/Session/SessionDb.class.php
$hander=new$class();
$hander->execute();
}else{
// 類沒(méi)有定義
throw_exception(L('_CLASS_NOT_EXIST_').': '.$class);
}
}
文件位置在ThinkPHP框架目錄下Extend/Driver/Session/SessionDb.class.php
Session相關(guān)操作具體內(nèi)容就不在這里講解了
3、創(chuàng)建DB驅(qū)動(dòng)數(shù)據(jù)表tb_session
創(chuàng)建這個(gè)表無(wú)需我們手動(dòng)去建表,在SessionDb.class.php的開(kāi)始部分,就有一段已經(jīng)編寫好的sql
復(fù)制那段sql,并且修改為如下:
; html-script: false ]CREATE TABLE tb_session (
session_id varchar(255) NOT NULL,
session_expire int(11) NOT NULL,
session_data blob,
UNIQUE KEY `session_id` (`session_id`)
);
1
2
3
4
5
6
;html-script:false]CREATETABLEtb_session(
session_idvarchar(255)NOTNULL,
session_expireint(11)NOTNULL,
session_datablob,
UNIQUEKEY`session_id`(`session_id`)
);
在數(shù)據(jù)庫(kù)中執(zhí)行即可創(chuàng)建成功
4、驗(yàn)證session自動(dòng)生成
經(jīng)過(guò)以上步驟,Session驅(qū)動(dòng)已經(jīng)全部設(shè)置完畢
接下來(lái)我們要驗(yàn)證Session是否正確生成了
驗(yàn)證方法其實(shí)很簡(jiǎn)單,就是登錄以后,查看tb_session數(shù)據(jù)表中是否生成了對(duì)應(yīng)的session記錄即可
另:由于session_data為二進(jìn)制數(shù)據(jù),所以無(wú)法直接在數(shù)據(jù)庫(kù)中查看,可通過(guò)程序查出,并通過(guò)print_r即可全部顯示
簡(jiǎn)易驗(yàn)證方法在IndexAction.class.php中加入如下代碼:
; html-script: false ]$session=M('session')->find();
print_r($session);
1
2
;html-script:false]$session=M('session')->find();
print_r($session);
二、Redis驅(qū)動(dòng)
知識(shí)點(diǎn):
1、初識(shí)Redis及Redis在Windows下的安裝和使用
2、Redis驅(qū)動(dòng)配置
3、Redis驅(qū)動(dòng)使用
4、Redis驅(qū)動(dòng)驗(yàn)證
1、初識(shí)Redis及Redis在Windows下的安裝和使用
http://www.newasp.net/soft/67186.html#downloads
下載解壓,根據(jù)自己的操作系統(tǒng)打開(kāi)相應(yīng)的目錄
雙擊redis-server.exe
即可開(kāi)啟redis服務(wù)
2、Redis驅(qū)動(dòng)配置
在massage/admin/Conf/config.php中添加如下配置:
//Session相關(guān)配置
; html-script: false ]'SESSION_PREFIX' => 'Sess_',
'SESSION_TYPE' => 'Redis',
//Redis相關(guān)配置
'REDIS_HOST' => '127.0.0.1',
'REDIS_PORT' => '6379',
1
2
3
4
5
;html-script:false]'SESSION_PREFIX'=>'Sess_',
'SESSION_TYPE'=>'Redis',
//Redis相關(guān)配置
'REDIS_HOST'=>'127.0.0.1',
'REDIS_PORT'=>'6379',
以上配置中,除了SESSION_PREFIX以外,其他配置都是必須要設(shè)置的
這里要特別說(shuō)明下,本地化支持
如果在初始化session設(shè)置的時(shí)候傳入prefix參數(shù)或者單獨(dú)設(shè)置了SESSION_PREFIX參數(shù)的話,就可以啟用本地化session管理支持。啟動(dòng)本地化session后,所有的賦值、取值、刪除以及判斷操作都會(huì)自動(dòng)支持本地化session。
本地化session支持開(kāi)啟后,生成的session數(shù)據(jù)格式由原來(lái)的
$_SESSION['name'] 變成 $_SESSION['前綴']['name']
假設(shè)前綴設(shè)置為think,則賦值操作:
session('name','value'); //設(shè)置session
相當(dāng)于:
$_SESSION['think']['name'] = 'value';
取值操作:
$value = session('name');
相當(dāng)于使用:
$value = $_SESSION['think']['name'];
刪除操作:
session('name',null);
相當(dāng)于:
unset($_SESSION['think']['name']);
清空操作:
session(null);
相當(dāng)于:
unset($_SESSION['think']);
判斷操作:
session('?name');
相當(dāng)于:
isset($_SESSION['think']['name']);
參考:http://www.thinkphp.cn/simple/functions_session.html
3、Redis驅(qū)動(dòng)使用
基于SessionDb.class.php,在ThinkPHP框架目錄(message/ThinkPHP/Extend/Driver/Session/)中,新建SessionRedis.class.php
代碼如下:
; html-script: false ]<?php
//自定義redis處理 驅(qū)動(dòng)
Class SessionRedis {
//REDIS連接對(duì)象
Private $redis;
//SESSION有效時(shí)間
Private $expire;
//functions.php有定義默認(rèn)執(zhí)行方法為execute
//具體代碼可參考Common/functions.php中,搜索session,可查詢到相關(guān)session自動(dòng)執(zhí)行的方法
Public function execute () {
session_set_save_handler(
array(&$this,"open"),
array(&$this,"close"),
array(&$this,"read"),
array(&$this,"write"),
array(&$this,"destroy"),
array(&$this,"gc"));
}
//打開(kāi)Session
Public function open ($path, $name) {
$this->expire = C('SESSION_EXPIRE') ? C('SESSION_EXPIRE') : ini_get('session.gc_maxlifetime');
$this->redis = new Redis();
return $this->redis->connect(C('REDIS_HOST'),C('REDIS_PORT'));
}
Public function close () {
return $this->redis->close();
}
Public function read ($id) {
$id = C('SESSION_PREFIX') . $id;
$data = $this->redis->get($id);
return $data ? $data : '';
}
//寫入session
Public function write ($id, $data) {
$id = C('SESSION_PREFIX') . $id;
return $this->redis->set($id, $data, $this->expire);
}
//銷毀SESSION
Public function destroy ($id) {
$id = C('SESSION_PREFIX') . $id;
return $this->redis->delete($id);
}
Public function gc ($maxLifeTime) {
return true;
}
}
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
;html-script:false]<?php
//自定義redis處理 驅(qū)動(dòng)
ClassSessionRedis{
//REDIS連接對(duì)象
Private$redis;
//SESSION有效時(shí)間
Private$expire;
//functions.php有定義默認(rèn)執(zhí)行方法為execute
//具體代碼可參考Common/functions.php中,搜索session,可查詢到相關(guān)session自動(dòng)執(zhí)行的方法
Publicfunctionexecute(){
session_set_save_handler(
array(&$this,"open"),
array(&$this,"close"),
array(&$this,"read"),
array(&$this,"write"),
array(&$this,"destroy"),
array(&$this,"gc"));
}
//打開(kāi)Session
Publicfunctionopen($path,$name){
$this->expire=C('SESSION_EXPIRE')?C('SESSION_EXPIRE'):ini_get('session.gc_maxlifetime');
$this->redis=newRedis();
return$this->redis->connect(C('REDIS_HOST'),C('REDIS_PORT'));
}
Publicfunctionclose(){
return$this->redis->close();
}
Publicfunctionread($id){
$id=C('SESSION_PREFIX').$id;
$data=$this->redis->get($id);
return$data?$data:'';
}
//寫入session
Publicfunctionwrite($id,$data){
$id=C('SESSION_PREFIX').$id;
return$this->redis->set($id,$data,$this->expire);
}
//銷毀SESSION
Publicfunctiondestroy($id){
$id=C('SESSION_PREFIX').$id;
return$this->redis->delete($id);
}
Publicfunctiongc($maxLifeTime){
returntrue;
}
}
接下來(lái)只要任何的Session操作,都會(huì)在Redis中記錄相關(guān)記錄
PS:在開(kāi)始使用Redis之前,先要找到php_redis.dll擴(kuò)展,否則會(huì)出現(xiàn)
Class 'Redis' not found
這樣的提示
Win7下64位系統(tǒng)可能還需要手動(dòng)編譯下才能加載成功
具體方法可參考:http://hi.baidu.com/rendong/item/c9cbacc289a4a4340831c60b
4、Redis驅(qū)動(dòng)驗(yàn)證
先來(lái)寫入一些Session吧,由于之前的登錄操作都有用到Session相關(guān)操作,那么我們就直接查看存入和讀取的內(nèi)容即可
打開(kāi)redis-cli.exe
輸入keys *
默認(rèn)是為空的
這時(shí)候我們進(jìn)入http://localhost/message/admin.php
完成一次登錄操作
這時(shí)候再輸入keys *
即可看到最新產(chǎn)生的Session
; html-script: false ]Sess_vf1egakhgkv9s6tq7uo480eo02
1
;html-script:false]Sess_vf1egakhgkv9s6tq7uo480eo02
輸入get Sess_vf1egakhgkv9s6tq7uo480eo02
即可看到相關(guān)的session信息
; html-script: false ]redis 127.0.0.1:6379> get Sess_vf1egakhgkv9s6tq7uo480eo02
"Sess_|a:5:{s:6:\"verify\";s:32:\"6a182a16e66268d7ce85fcfe945df787\";s:3:\"uid\"
;s:1:\"1\";s:8:\"username\";s:5:\"admin\";s:9:\"logintime\";s:19:\"2014-03-09 23
:37:43\";s:7:\"loginip\";s:9:\"127.0.0.1\";}"
1
2
3
4
;html-script:false]redis127.0.0.1:6379>getSess_vf1egakhgkv9s6tq7uo480eo02
"Sess_|a:5:{s:6:\"verify\";s:32:\"6a182a16e66268d7ce85fcfe945df787\";s:3:\"uid\"
;s:1:\"1\";s:8:\"username\";s:5:\"admin\";s:9:\"logintime\";s:19:\"2014-03-09 23
:37:43\";s:7:\"loginip\";s:9:\"127.0.0.1\";}"
PS:由于啟用了SESSION_PREFIX
這時(shí)候要查看相關(guān)的SESSION信息
要用如下方式來(lái)查看$_SESSION[C('SESSION_PREFIX')]['uid']
三、Memcache驅(qū)動(dòng)
知識(shí)點(diǎn):
1、初識(shí)Memcache及Memcache在Windows下的安裝和使用
2、Memcache驅(qū)動(dòng)配置
3、Memcache驅(qū)動(dòng)使用
4、Memcache驅(qū)動(dòng)驗(yàn)證
1、初識(shí)Memcached及Memcache在Windows下的安裝和使用
Memcached和Redis一樣,是個(gè)key-value的nosql容器
還需要注意Memcached是memcache的服務(wù)端,而memcache,一般是指memcache的客戶端
Memcached 是一個(gè)高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫(kù)負(fù)載。它通過(guò)在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來(lái)減少讀取數(shù)據(jù)庫(kù)的次數(shù),從而提供動(dòng)態(tài)、數(shù)據(jù)庫(kù)驅(qū)動(dòng)網(wǎng)站的速度。Memcached基于一個(gè)存儲(chǔ)鍵/值對(duì)的hashmap。其守護(hù)進(jìn)程(daemon )是用C寫的,但是客戶端可以用任何語(yǔ)言來(lái)編寫,并通過(guò)memcached協(xié)議與守護(hù)進(jìn)程通信。但是它并不提供冗余(例如,復(fù)制其hashmap條目);當(dāng)某個(gè)服務(wù)器S停止運(yùn)行或崩潰了,所有存放在S上的鍵/值對(duì)都將丟失。
關(guān)于Memcached的介紹請(qǐng)參考:Memcached深度分析
下載Windows的Server端
安裝Memcache Server(也可以不安裝直接啟動(dòng))
1. 下載memcached的windows穩(wěn)定版,解壓放某個(gè)盤下面,比如在c:\memcached
2. 在CMD下輸入 "c:\memcached\memcached.exe -d install" 安裝.
3. 再輸入:"c:\memcached\memcached.exe -d start" 啟動(dòng)。NOTE: 以后memcached將作為windows的一個(gè)服務(wù)每次開(kāi)機(jī)時(shí)自動(dòng)啟動(dòng)。這樣服務(wù)器端已經(jīng)安裝完畢了。
如果下載的是二進(jìn)制的版本,直接運(yùn)行就可以了,可以加上參數(shù)來(lái)加以設(shè)置。
常用設(shè)置:
-p 監(jiān)聽(tīng)的端口
-l 連接的IP地址, 默認(rèn)是本機(jī)
-d start 啟動(dòng)memcached服務(wù)
-d restart 重起memcached服務(wù)
-d stop|shutdown 關(guān)閉正在運(yùn)行的memcached服務(wù)
-d install 安裝memcached服務(wù)
-d uninstall 卸載memcached服務(wù)
-u 以的身份運(yùn)行 (僅在以root運(yùn)行的時(shí)候有效)
-m 最大內(nèi)存使用,單位MB。默認(rèn)64MB
-M 內(nèi)存耗盡時(shí)返回錯(cuò)誤,而不是刪除項(xiàng)
-c 最大同時(shí)連接數(shù),默認(rèn)是1024
-f 塊大小增長(zhǎng)因子,默認(rèn)是1.25
-n 最小分配空間,key+value+flags默認(rèn)是48
-h 顯示幫助
要在windows下讓php支持memcache是需要下載對(duì)應(yīng)的dll
http://www.com133.com/11
這里有對(duì)應(yīng)版本的下載,大家可以根據(jù)版本自行下載
2、Memcache驅(qū)動(dòng)配置
修改掉之前的Redis配置
在Conf/config.php中添加
; html-script: false ]//Memcache
'SESSION_TYPE' => 'Memcache',
//Memcache服務(wù)器
'MEMCACHE_HOST' => '127.0.0.1',
//Memcache端口
'MEMCACHE_PORT' => '11211',
1
2
3
4
5
6
;html-script:false]//Memcache
'SESSION_TYPE'=>'Memcache',
//Memcache服務(wù)器
'MEMCACHE_HOST'=>'127.0.0.1',
//Memcache端口
'MEMCACHE_PORT'=>'11211',
3、Memcache驅(qū)動(dòng)使用
將原來(lái)Redis驅(qū)動(dòng)復(fù)制為SessionMemcache.class.php
位置依然在message/ThinkPHP/Extend/Driver/Session/SessionMemcache.class.php
代碼如下:
; html-script: false ]<?php
//自定義memcache處理 驅(qū)動(dòng)
Class SessionMemcache {
//memcache連接對(duì)象
Private $memcache;
//SESSION有效時(shí)間
Private $expire;
Public function execute () {
session_set_save_handler(
array(&$this,"open"),
array(&$this,"close"),
array(&$this,"read"),
array(&$this,"write"),
array(&$this,"destroy"),
array(&$this,"gc"));
}
//打開(kāi)Session
Public function open ($path, $name) {
$this->expire = C('SESSION_EXPIRE') ? C('SESSION_EXPIRE') : ini_get('session.gc_maxlifetime');
$this->memcache = new Memcache();
return $this->memcache->connect(C('memcache_HOST'),C('memcache_PORT'));
}
Public function close () {
return $this->memcache->close();
}
Public function read ($id) {
$id = C('SESSION_PREFIX') . $id;
$data = $this->memcache->get($id);
return $data ? $data : '';
}
//寫入session
Public function write ($id, $data) {
$id = C('SESSION_PREFIX') . $id;
return $this->memcache->set($id, $data, $this->expire);
}
//銷毀SESSION
Public function destroy ($id) {
$id = C('SESSION_PREFIX') . $id;
return $this->memcache->delete($id);
}
Public function gc ($maxLifeTime) {
return true;
}
}
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
;html-script:false]<?php
//自定義memcache處理 驅(qū)動(dòng)
ClassSessionMemcache{
//memcache連接對(duì)象
Private$memcache;
//SESSION有效時(shí)間
Private$expire;
Publicfunctionexecute(){
session_set_save_handler(
array(&$this,"open"),
array(&$this,"close"),
array(&$this,"read"),
array(&$this,"write"),
array(&$this,"destroy"),
array(&$this,"gc"));
}
//打開(kāi)Session
Publicfunctionopen($path,$name){
$this->expire=C('SESSION_EXPIRE')?C('SESSION_EXPIRE'):ini_get('session.gc_maxlifetime');
$this->memcache=newMemcache();
return$this->memcache->connect(C('memcache_HOST'),C('memcache_PORT'));
}
Publicfunctionclose(){
return$this->memcache->close();
}
Publicfunctionread($id){
$id=C('SESSION_PREFIX').$id;
$data=$this->memcache->get($id);
return$data?$data:'';
}
//寫入session
Publicfunctionwrite($id,$data){
$id=C('SESSION_PREFIX').$id;
return$this->memcache->set($id,$data,$this->expire);
}
//銷毀SESSION
Publicfunctiondestroy($id){
$id=C('SESSION_PREFIX').$id;
return$this->memcache->delete($id);
}
Publicfunctiongc($maxLifeTime){
returntrue;
}
}
添加如上代碼后,即配置驅(qū)動(dòng)完成,其他程序代碼無(wú)需修改
接下來(lái)就是驗(yàn)證了
4、Memcache驅(qū)動(dòng)驗(yàn)證
Memcache測(cè)試方法比Redis相對(duì)要復(fù)雜一些,需要掌握一些Memcache內(nèi)置的命令
由于這個(gè)例子我覺(jué)得有其他用途,所以專門寫了篇文章,有需要的朋友可以自行查看
具體操作參見(jiàn)
http://www.ttlsa.com/memcache/memcache-list-all-keys/
總結(jié)
以上是生活随笔為你收集整理的php5.5 session,(五)ThinkPHP实践之Session驱动-TTLSA的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。