其他教程

其他教程

Products

当前位置:首页 > 其他教程 >

php Redis存储Session 【1】

GG网络技术分享 2025-03-18 16:17 0


PHP默认使用文件存储session,如果并发量大,效率非常低。而Redis对高并发的支持非常好,所以,可以使用redis替代文件存储session。

php的session_set_save_handler 函数的作用和使用方法。

该函数定义用户级session保存函数(如打开、关闭、写入等)。原型如下:

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从数据存储方中取得数据,并返回此数据。如果数据为空,可以返回一个空字符串。此函数在调用session_start 前被触发
write 当数据存储时调用。有两个参数,一个是session ID,另外一个是session的数据
destroy 当调用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\\\";\"

安装redis服务以及php redis扩展

一:redis安装

Download, extract and compile Redis with:
$ wget http://download.redis.io/releases/redis-3.0.4.tar.gz
$ tar xzf redis-3.0.4.tar.gz
$ cd redis-3.0.4
$ make
The binaries that are now compiled are available in the src directory. Run Redis with:
$ src/redis-server
You can interact with Redis using the built-in client:
$ src/redis-cli
redis> set foo bar
OK
redis> get foo
\"bar\"
More:http://www.redis.io/download

二、php扩展:

更多版本:http://pecl.php.net/package/redis
wget http://pecl.php.net/get/redis-2.2.5.tgz
#解压
tar zxvf redis-2.2.5.tgz
#进入安装目录
cd redis-2.2.5
/usr/local/php/bin/phpize
#配置
./configure --with-php-config=/usr/local/php/bin/php-config
#编译安装
make && make install

安装完成之后,出现下面的安装路径
/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

配置php支持

#编辑配置文件php.ini,
vim /usr/local/php/etc/php.ini
在最后一行添加以下内容
extension=\"redis.so\"

这个时候phpinfo()就可以看到redis扩展了。

redis小例子:

$redis = new redis();

$test=$redis->connect(\'127.0.0.1\', 6379);

var_dump($test);

$result = $redis->set(\'test\',\"111cn.net\");

var_dump($result); //结果:bool(true)

$result = $redis->get(\'test\');

var_dump($result); //结果:string(11) \"111cn.net\"

php.ini的设置(所有都用redis存储session)

session.save_handler = Redis

session.save_path = “tcp://192.168.5.114:6379”

//Redis不需要密码验证

session.save_path = “tcp://192.168.5.114:6379?auth=password”

//Redis 需要密码验证

修改后重启php-fpm,phpinfo()可以查看到session存储在redis中。

代码设置(可以灵活使用)

//不修改php.ini,也可以在代码中加入:

ini_set(\"session.save_handler\",\"redis\");

ini_set(\"session.save_path\",\"tcp://127.0.0.1:6379\");

ini_set(\"session.save_path\",\'tcp://192.168.5.114:6379?auth=password\')

如果配置文件 /etc/redis.conf 里设置了连接密码 requirepass,保存 session 的时候会报错,save_path 这样写 tcp://127.0.0.1:6379?auth=authpwd 即可
如果选择redis数据库
session.save_path = \"tcp://xx.xx.xx.xx:6789?database=11\"
,诸如此类。

查看redis存储session的值

<?php

session_start();

$_SESSION[\'sessionid\'] = \'www.111cn.net\';

$redis = new redis();

$redis->connect(\'127.0.0.1\', 6379);

//redis用 PHPREDIS_SESSION: 加 session_id 作为key,并且是以string的形式存储

echo $redis->get(\'PHPREDIS_SESSION:\' . session_id()); //输出www.111cn.net

?>

在网上看到有人质疑redis存储session值会有并发一致性的问题(文件存储session有文件锁来处理),这块没有研究。

标签: 函数 数据

提交需求或反馈

Demand feedback