日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

php5.5 session,(五)ThinkPHP实践之Session驱动-TTLSA

發(fā)布時(shí)間:2023/12/1 php 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php5.5 session,(五)ThinkPHP实践之Session驱动-TTLSA 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。