这里有新鲜出炉的 Redis 命令参考,程序狗速度看过来!
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
这篇文章主要介绍了 PHP 使用 Redis 替代文件存储 Session 的方法, 结合实例形式较为详细的分析了 Session 的基本操作方法及使用 Redis 存储 session 的相关技巧, 需要的朋友可以参考下
本文实例讲述了 PHP 使用 Redis 替代文件存储 Session 的方法。分享给大家供大家参考,具体如下:
PHP 默认使用文件存储 session,如果并发量大,效率非常低。而 Redis 对高并发的支持非常好,所以,可以使用 redis 替代文件存储 session。
这里,介绍下 php 的
函数的作用和使用方法。该函数定义用户级 session 保存函数(如打开、关闭、写入等)。
- session_set_save_handler
原型如下:
- bool session_set_save_hanler(callback open,callback close,callback read,callback write,callback destory,callback gc)
session_set_save_handler 函数各参数作用如下表
参 数 | 描述 |
---|---|
open | 当 session 打开时调用此函数。接收两个参数,第一个参数是保持 session 的路径,第二个参数是 session 的名字 |
close | 当 session 操作完成时调用此函数。不接收参数。 |
read | 以 session ID 作为参数。通过 session ID 从数据存储方中取得数据,并返回此数据。如果数据为空,可以返回一个空字符串。此函数在调用 前被触发 |
write | 当数据存储时调用。有两个参数,一个是 session ID,另外一个是 session 的数据 |
destroy | 当调用 函数时触发 destroy 函数。只有一个参数 session ID |
gc | 当 php 执行 session 垃圾回收机制时触发 |
在使用该函数前,先把 php.ini 配置文件的 session.save_handler 选项设置为 user,否则 session_set_save_handle 不会生效。
编写一个 session 管理类 sessionManager.php , 代码如下:
- <?php
- class SessionManager{
- private $redis;
- private $sessionSavePath;
- private $sessionName;
- private $sessionExpireTime=30;//redis,session的过期时间为30s
- public function __construct(){
- $this->redis = new Redis();//创建phpredis实例
- $this->redis->connect('127.0.0.1',6379);//连接redis
- $this->redis->auth("107lab");//授权
- $retval = session_set_save_handler(
- array($this,"open"),
- array($this,"close"),
- array($this,"read"),
- array($this,"write"),
- array($this,"destroy"),
- array($this,"gc")
- );
- session_start();
- }
- public function open($path,$name){
- return true;
- }
- public function close(){
- return true;
- }
- public function read($id){
- $value = $this->redis->get($id);//获取redis中的指定记录
- if($value){
- return $value;
- }else{
- return '';
- }
- }
- public function write($id,$data){
- if($this->redis->set($id,$data)){//以session ID为键,存储
- $this->redis->expire($id,$this->sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
- return true;
- }
- return false;
- }
- public function destroy($id){
- if($this->redis->delete($id)){//删除redis中的指定记录
- return true;
- }
- return false;
- }
- public function gc($maxlifetime){
- return true;
- }
- public function __destruct(){
- session_write_close();
- }
- }
SessionManager 构造函数主要用来连接 Redis 服务器,使用 session_set_save_handler 函数设置 session 回调函数,并调用 session_start 函数开启 session 功能。因为本例中 open、close 和 gc 回调函数的作用不是很大,所以直接返回 true。
在 write 回调函数中,以 session ID 作为 key, 把 session 的数据作为 value 存储到 redis 服务器,设置 session 的过期时间为 30 秒。在 read 回调函中,以 session ID 作为 key 从 redis 服务器中读取数据,并返回此数据。而在 destroy 回调函数重,则以 session ID 作为 key 从 redis 服务器中删除对应的 session 数据。
使用时,只需包含 SessionManager 类,然后实例化一个 SessionManager 对象。下面建立个 session_set.php 文件。输入代码
- <?php
- include('SessionManager.php');
- new SessionManager();
- $_SESSION['username'] = 'captain';
然后再创建一个 session_get.php 文件,输入如下代码:
- <?php
- include('SessionManager.php');
- new SessionManager();
- echo $_SESSION['username'];
测试时,首先访问 session_set.php,然后再访问 session_get.php, 输出结果如下所示:
再查看 redis 数据库,如下所示
- 127.0.0.1:6379> keys *
- 1) "oe94eic337slnjv1bvlreoa574"
- 127.0.0.1:6379> get oe94eic337slnjv1bvlreoa574
- "username|s:7:\"captain\";"
希望本文所述对大家 PHP 程序设计有所帮助。
来源: http://www.phperz.com/article/17/0824/340551.html