(五)ThinkPHP实践之Session驱动-TTLSA

tonyty163 PHP ttlsa教程系列519,3424字数 7448阅读24分49秒阅读模式

Session驱动是指Session在thinkphp中的存储驱动,通过不同的方式,可以将Session存储在不同的“容器”中
对Session有兴趣的的朋友可以查阅相关资料,本篇仅针对thinkphp的session驱动进行讲解

一、DB驱动文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

知识点:
1、thinkphp框架默认DB驱动调用
2、SessionDB驱动库调用详解
3、创建DB驱动数据表tb_session
4、验证session自动生成文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

1、thinkphp框架默认DB驱动调用
如果在不设置任何驱动的情况下,windows会存储在wamp/tmp/目录下,linux会存储在/tmp/目录下,文件名都以"sess_"为前缀
其实说调用只是让DB类生效,作为Session的默认存储方式
配置方法是在message/admin/Conf/config.php文件中加入文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

'SESSION_TYPE' => 'Db',

即可,这样DB驱动就配置完成了文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

2、SessionDB驱动库调用详解
很多朋友估计跟我一样,配置完了发现自己好像什么都没明白,于是就要挖根究底,找到了调用DB驱动类的方法
首先找到框架默认函数文件在ThinkPHP框架目录下Common/functions.php
找到session管理函数段
重点代码如下:文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

//以下内容就是查找驱动类的判断
 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相关操作具体内容就不在这里讲解了文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

3、创建DB驱动数据表tb_session
创建这个表无需我们手动去建表,在SessionDb.class.php的开始部分,就有一段已经编写好的sql
复制那段sql,并且修改为如下:文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

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`)
 );

在数据库中执行即可创建成功文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

4、验证session自动生成
经过以上步骤,Session驱动已经全部设置完毕
接下来我们要验证Session是否正确生成了
验证方法其实很简单,就是登录以后,查看tb_session数据表中是否生成了对应的session记录即可
另:由于session_data为二进制数据,所以无法直接在数据库中查看,可通过程序查出,并通过print_r即可全部显示
简易验证方法在IndexAction.class.php中加入如下代码:文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

$session=M('session')->find();
print_r($session);

二、Redis驱动
知识点:
1、初识Redis及Redis在Windows下的安装和使用
2、Redis驱动配置
3、Redis驱动使用
4、Redis驱动验证文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

1、初识Redis及Redis在Windows下的安装和使用
http://www.newasp.net/soft/67186.html#downloads
下载解压,根据自己的操作系统打开相应的目录
双击redis-server.exe
即可开启redis服务文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

2、Redis驱动配置
在massage/admin/Conf/config.php中添加如下配置:文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

//Session相关配置文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

'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文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

3、Redis驱动使用
基于SessionDb.class.php,在ThinkPHP框架目录(message/ThinkPHP/Extend/Driver/Session/)中,新建SessionRedis.class.php
代码如下:文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

<?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;
	}
}

接下来只要任何的Session操作,都会在Redis中记录相关记录文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

PS:在开始使用Redis之前,先要找到php_redis.dll扩展,否则会出现
Class 'Redis' not found
这样的提示
Win7下64位系统可能还需要手动编译下才能加载成功
具体方法可参考:http://hi.baidu.com/rendong/item/c9cbacc289a4a4340831c60b文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

4、Redis驱动验证
先来写入一些Session吧,由于之前的登录操作都有用到Session相关操作,那么我们就直接查看存入和读取的内容即可
打开redis-cli.exe
输入keys *
默认是为空的
这时候我们进入http://localhost/message/admin.php
完成一次登录操作
这时候再输入keys *
即可看到最新产生的Session文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

Sess_vf1egakhgkv9s6tq7uo480eo02

输入get Sess_vf1egakhgkv9s6tq7uo480eo02
即可看到相关的session信息文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

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\";}"

PS:由于启用了SESSION_PREFIX
这时候要查看相关的SESSION信息
要用如下方式来查看$_SESSION[C('SESSION_PREFIX')]['uid']文章源自运维生存时间-https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/

三、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官方:http://danga.com/memcached/

关于Memcached的介绍请参考:Memcached深度分析

下载Windows的Server端

下载地址:http://code.jellycan.com/memcached/

安装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中添加

//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

代码如下:

<?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;
	}
}

添加如上代码后,即配置驱动完成,其他程序代码无需修改
接下来就是验证了

4、Memcache驱动验证
Memcache测试方法比Redis相对要复杂一些,需要掌握一些Memcache内置的命令
由于这个例子我觉得有其他用途,所以专门写了篇文章,有需要的朋友可以自行查看
具体操作参见
https://www.ttlsa.com/memcache/memcache-list-all-keys/

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
tonyty163
  • 本文由 发表于 11/03/2014 23:33:51
  • 转载请务必保留本文链接:https://www.ttlsa.com/php/thinkphp-session-db-redis-memcache-ttlsa/
  • db
  • redis
  • Thinkphp,session,驱动,memcache
评论  5  访客  5
    • qiujiao
      qiujiao 0

      redis write函数 $data 为空。怎么解决

      • 七秒的记忆_15795
        七秒的记忆_15795 9

        特来学习!

        • xy
          xy 9

          这个作者长得很阳光吗?为什么还木有给我QQ号啊

            • xy
              xy 9

              @ xy 哈哈,找这个写php文档的作者啊,tongty163,想临时抱抱大神的大腿啊

          评论已关闭!