php ?redis,PHP使用Redis存储Session

对于大访问量的网站来说,会有许多的客户端和服务端建立链接,就会生成许多 Session 文件,由于 Session 文件是存储在硬盘上的,因此每次服务器去读取这些 Session 文件都要经过许多的 I/O 操作。

PHP 中可使用 session_set_save_handle() 函数自定义 Session 保存函数(如打开、关闭、写入、读取等),其语法如下:

bool session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid ] )

如果想使用 PHP 内置的会话存储机制之外的方式,可以使用本函数。例如,可以自定义会话存储函数来将会话数据存储到数据库。

该函数的参数说明如下:

open(string$savePath,string$sessionName)

open 回调函数类似于类的构造函数,在会话打开的时候被调用。这是自动开始会话或者通过调用 session_start() 手动开始会话之后第一个被调用的回调函数。

此回调函数操作成功返回 true,反之返回 false。

close()

close 回调函数类似于类的析构函数。在 write 回调函数调用之后调用。当调用 session_write_close() 函数之后,也会调用 close 回调函数。

此回调函数操作成功返回 true,反之返回 false。

read(string$sessionId)

如果会话中有数据,那么 read 回调函数必须返回将会话数据编码(序列化)后的字符串。如果会话中没有数据,read 回调函数就返回空字符串。

在自动开始会话或者通过调用 session_start() 函数手动开始会话之后,PHP 内部调用 read 回调函数来获取会话数据。在调用 read 之前,PHP 会调用 open 回调函数。

read 回调返回的序列化之后的字符串格式必须与 write 回调函数保存数据时的格式完全一致。PHP 会自动反序列化返回的字符串并填充 $_SESSION 超级全局变量。虽然数据看起来和 serialize() 函数很相似,但是它们是不同的。

write(string$sessionId,string$data)

在会话保存数据时会调用 write 回调函数。此回调函数接收当前会话 ID 以及 $_SESSION 中数据序列化之后的字符串作为参数。

序列化会话数据的过程由 PHP 根据 session.serialize_handler 设定值来完成。序列化后的数据将和会话 ID 关联在一起进行保存。当调用 read 回调函数获取数据时,所返回的数据必须和传入 write 回调函数的数据完全保持一致。PHP 会在脚本执行完毕或调用 session_write_close() 函数之后调用此回调函数。

注意,在调用完此回调函数之后,PHP 内部会调用 close 回调函数。

PHP 会在输出流写入完毕并且关闭之后才调用 write 回调函数,所以在 write 回调函数中的调试信息不会输出到浏览器中。如果需要在 write 回调函数中使用调试输出,建议将调试输出写入到文件。

destroy($sessionId)

当调用 session_destroy() 函数,或者调用 session_regenerate_id() 函数并且设置 destroy 参数为 true 时会调用此回调函数。

此回调函数操作成功返回 true,反之返回 false。

gc($lifetime)

为了清理会话中的旧数据,PHP 会不时地调用垃圾收集回调函数。调用周期由 session.gc_probability 和 session.gc_divisor 参数控制。传入到此回调函数的 lifetime 参数由 session.gc_maxlifetime 设置。

此回调函数操作成功返回 true,反之返回 false。

create_sid()

当需要新的会话 ID 时被调用的回调函数。回调函数被调用时无传入参数,其返回值应该是一个字符串格式的、有效的会话 ID。

PHP 使用 Redis 来存储 Session

下面举一个关于使用 Redis 代替文件存储 Session 的例子。

首先编写一个管理 Session 的类 sessionmanager,代码如下:

class sessionmanager{

private $redis;

private $sessionsavepath;

private $sessionname;

public function __construct(){

$this->redis = new Redis();

$this->redis->connect('10.116.19.14',6400);

$reval = 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($patn,$name){

return true;

}

public function close(){

return true;

}

public function read($id){

$value = $this->redis->get($id);

if($value) {

return $value;

} else {

return false;

}

}

public function write($id,$data){

if($this->redis->set($id,$data)) {

$this->redis->expire($id,60);

return true;

} else {

return false;

}

}

public function destroy($id) {

if($this->redis->delete($id)) {

return true;

}

return false;

}

public function gc($maxlifetime){

return true;

}

public function __destruct(){

session_write_close();

//TODO: Implement __destruct() method.

}

}

?>

将以上代码保存为 sessionmanager.php 文件。

在该类的构造函数中,使用 session_set_save_handler() 设置 Session 的处理函数,实例化该类时便完成了用指定函数接管系统处理 Session 的工作。

在 write 回调函数中,以传入的 sessionID 作为 key,以 Session 的值作为 redis 中 key 的值存入 Redis,并设置过期时间为 60 秒;read 方法以传入的 sessionID 为 key 从 Redis 取出相应的 Session 值。destroy 可根据传入的 sessionID 删除 Redis 中的 Session。

我们编写另外一个设置 Session 的脚本,并引入 sessionmanager.php 文件,实例化 sessionmanager 类,代码如下:

include 'sessionmanager.php';

new sessionmanager();

$_SESSION['namehaha'] = 'lixiaolong';

$_SESSION['namehah'] = 'lixiaolong';

$_SESSION['namehaa'] = 'lixiaolong';

$_SESSION['namhaha'] = 'lixiaolong';

$_SESSION['namhaha'] = array('a'=>1,2,3,4,4);

?>

保存以上代码为 set.php,另外编写一个可访问 Session 的脚本,代码如下:

include 'sessionmanager.php';

new sessionmanager();

var_dump($_SESSION);

?>

保存以上代码为 get.php 文件。测试时先访问 set.php,再访问 get.php,会在浏览器中输出以下结果:

array(4)

{

["namehaha"]=> string(10) "lixiaolong"

["namehah"]=> string(10) "lixiaolong"

["namehaa"]=> string(10) "lixiaolong"

["namhaha"]=> array(5)

{

["a"]=> int(1)

[0]=> int(2)

[1]=> int(3)

[2]=> int(4)

[3]=> int(4)

}

}

可见已经成功地设置并获得了 Session。查看 redis 中存储的 Session 信息:

redis 127.0.0.1:6400> get ruevh62hlm809d1p2lg2o0fbv7

"namehaha|s:10:\"lixiaolong\";namehah|s:10:\"lixiaolong\"; namehaa|s:10:\"lixiaolong\";namhaha|a:5:{s:1:\"a\";i:1;i:0;i:2;i:1;i:3;i:2;i:4;i:3;i:4;}"

redis 中是以 string 的数据类型存储 Session 的,其 key 便是 sessionID,也是 HTTP Request 中的 cookie 名为 PHPSESSID 的值。Session 在 redis 和文件中的存储形式是一样的,只不过在 redis 中对双引号做了转义而已。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信支付现金红包接口(转)

微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包。通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果。具体能力如下:…

php 打印对象到文件,php实现将数组或对象写入到文件的方法小结【三种方法】...

本文实例讲述了php实现将数组或对象写入到文件的方法。分享给大家供大家参考,具体如下:php将数组或对象原样写入或保存到文件有三种方法可以实现第一种方法是使用serialize,第二种方法是使用print_r,第三种方法是使用var_export&a…

The return types for the following stored procedures could not be detected

1、使用dbml映射数据库,添加存储过程到dbml文件时报错。 2、原因:存储过程中使用了临时表 3、解决方案 3.1 通过自定义表值变量实现 Ex: DECLARE TempTable TABLE ( AttributeID INT, Value NVARCHAR(200) ) INSERT INTO TempTable Select * from Attrib…

webstock php,workerman_connection

workerman_connection 测试WebStock 功能Description整理PHP 实现webstock 功能的相关流程。感谢workerman 开发作者提供开源组件。安装 composer# curl -sS https://getcomposer.org/installer | php如果安装 composer 提示PHP 版本不够按照如下处理,否则跳过。提示…

短信通信的几种情况和CMS错误

1. 如何与GSM MODEM建立通信联系 2. 不能与GSM MODEM进行正常的通信或总是在仿真终端上出现乱码 3. 如何才能知道错误代码 4. 发送短消息后,收到出错信息CMS ERROR 512 5. 发送短消息后,收到出错…

php+管道+pipe管道,angular2+管道pipe

一.什么是Pipe?就是管道,简单来说,管道的作用就是传输。并且不同的管道具有不同的作用。(其实就是处理数据)二.pipe用法{{ 输入数据 | 管道 : 管道参数}} (其中‘|’是管道操作符)三.Angular自带的pipe函数管道功能DatePipe 日期管道,格式…

[字符串]与[数组]的互相转换

1.字符串转换为数组 var a"1,2,3";var ba.split(,); 2.数组转换为字符串 var c[1,2,3];var dc.join(,); 转载于:https://www.cnblogs.com/zqzjs/p/4693849.html

java android 界面设计,Android精美登录界面设计

在网上在到一个登录界面感觉挺不错的,给大家分享一下~先看效果图:这个Demo除了按钮、小猫和Logo是图片素材之外,其余的UI都是通过代码实现的。一、背景背景蓝色渐变,是通过一个xml文件来设置的。代码如下:background_l…

linux查看文件大小

du -s [文件名] du -sh [文件名] ls -lh [文件名]转载于:https://www.cnblogs.com/chenqionghe/p/4694070.html

jmeter java接口,jmeter并发测试java接口 | 学步园

Sample这里我用到主要JMeter的线程和报表,扩展了他的“Java请求”这个应用类别。要扩展此应用,要用到lib/ext/ApacheJMeter_java.jar,他封装此应用。首先,需要继承ApacheJMeter_java.jar中的抽象类AbstractJavaSamplerClient,它提…

Web项目练习总结(错误校正篇)

老师布置任务,从SVN上弄个项目来练练手,熟悉下过程。 myeclipse安装SVN 然后把MobileManageSys下下来 然后漫长的等待。。。 然后配置数据库,导入,这里用的是SQLyog,其他的也可以 之后这里会产生一大堆的错误&#xff…

php 网格,PHP中的数据网格

你可以使用http://phpgrid.com$dg new C_DataGrid("SELECT * FROM orders", "orderNumber", "orders");// change column titles$dg->set_col_title("orderNumber", "Order No.");$dg->set_col_title("orderDat…

matlab常用隶属度函数,常用隶属函数.ppt

模糊集基本理论 典型隶属函数 如前所述, 构造恰当的隶属函数是模糊集理论应用的基础。一种基本的构造隶属函数的方法是“参考函数法”, 即参考一些典型的隶属函数, 通过选择适当的参数, 或通过拟合、整合、实验等手段得到需要的隶属函数。 下面介绍典型隶属函数(最早由法国学者…

适配器模式的应用

1.适配源类:java.util.Properties 2.适配目标类:FileIO 3.适配器 FileProperties package fileio;import java.io.IOException;public interface FileIO {public void readFromFile(String fileName) throws IOException;public void writeToFile(String…

nginx php7提速,nginx+php7-fpm 性能提升几倍跟踪实践结果并优化

nginxphp7-fpm 性能提升几倍跟踪实践结果并优化nginxphp7-fpm 性能提升几倍,跟踪实践结果并优化历史ubuntu服务器使用的apachephp5,现在使用nginuxphp7-fpm方式,看效果图,啥也不说了。强烈推荐升级到php7,当然升级中基…

Where条件的in里面放太多数据导致很慢

比如:select * from TableA where ID in (42,216,219,230,231,220,249,250,221,251,252,217,253,255,256,254,257,258,1804) 52W数据,查询速度19386ms,好慢怎么办?程序都卡死了。 那么试一下百度搜索到的优化方式? 1.将…

inur new.php id,Cmsez(随易)全站系统注入0day

allinurl:"owered by CMSEZ" comments.php inurlowered by CMSEZ//commentsinclude "mainfile.php";$artnew article();//设定$confirmyes;//yes:需要管理员认证后才能显示,no:直接显示$membernew member();$user_info$member->member_auth();$ulevel$u…

matlab地球卫星模型,地球卫星三维运行轨道MATLAB仿真

地球卫星三维运行轨道MATLAB仿真1、问题的描述3 轨道上运行的地球卫星,根据牛顿第二定律Fma以及万有引力定律F-GmME*r/r,3可得a-GME*r/r,即x -GME*x/r3 3 y -GME*y/r; z -GM*z/r3E (1)式中,(x,y,z)表示卫星…

LeetCode 3. Longest Substring Without Repeating Characters

原题链接在这里:https://leetcode.com/problems/longest-substring-without-repeating-characters/ 题目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repea…

The mook jong 计数DP

The mook jong ZJiaQ为了强身健体,决定通过木人桩练习武术。ZJiaQ希望把木人桩摆在自家的那个由1*1的地砖铺成的1*n的院子里。由于ZJiaQ是个强迫症,所以他要把一个木人桩正好摆在一个地砖上,由于木人桩手比较长,所以两个木人桩之间…