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