宝哥软件园

如何在PHP中使用Redis接管文件存储Session

编辑:宝哥软件园 来源:互联网 时间:2021-08-28

前言

默认情况下,Php使用文件来存储会话。如果并发量大,效率会很低。Redis非常支持高并发,所以可以用redis来代替文件来存储会话。

最近遇到了这个问题。之前在网上找到一个直播系统,供客户使用。一开始没问题。人数上来之后,网站就开始卡住了,卡住了。在查看了php慢日志之后,我发现了session_start()的图。嗯,原来是一个邪恶的文件存储会话,和我之前进的坑一模一样.教务查询系统直接使用的会话没有使用cookie,导致php在高并发的情况下原地爆炸。

[0x 00007 fff 67 ee 6740]session _ start()[0x 00007 fff 67 ee 7b 70]转储失败解决方案

用cookie完全替换会话,并使用mysql或redis来接管会话坑中的坑

因为这个直播系统没有框架,没有设计规范,各种会话操作分散在不同的文件中,用第一种方案完全是吃力不讨好。再者,直播系统的聊天交互等功能都涉及到了大量的mysql操作,然后接管与mysql的会话变相增加了数据库的压力,最终决定接管与redis的会话。

具体实现

Php有一个内置的save_handler来操作会话,并使用session_set_save_handler来接管所有的会话管理工作。在使用此功能之前,请将php.ini配置文件的session.save _ handler选项设置为user,否则session_set_save_handle将不会生效。除了安装redis,php扩展还需要添加redis。

(以下代码来自网络,不知道哪位大哥是原创)

用以下代码编写一个会话管理类sessionManager.php:

?phpclassessionmanager { private $ redis;private $ sessionSavePathprivate $ sessionNameprivate $ sessionExpireTime=30//redis,会话到期时间为30s public function _ _ construct(){ $ this-redis=new redis();//创建phpredis实例$ this-Redis-connect ('127.0.0.1 ',6379);//连接redis $ this-redis-auth(' 107 lab ');//authorize $ retval=session _ set _ save _ handler(array ($ this,' open ')、array ($ this,' close ')、array ($ this,' read ')、array ($ this,' write ')、array($ this,' destroy ')session _ start();} public function open($path,$ name){ return true;} public function close(){ return true;} public function read($ id){ $ value=$ this-redis-get($ id);//获取指定的记录if($ value){ return $ value;} else { return“”;}} public function write ($ id,$ data) {if ($ this-redis-set ($ id,$ data)){//以session ID为密钥,存储$ this-redis-expire ($ id,$ this-session expire time);//设置redis中数据的到期时间,即session的到期时间为return true}返回false} public function destroy($ id){ if($ this-redis-delete($ id)){//删除redis中指定的记录返回true}返回false}公共函数GC($ max lifetime){ return true;} public function _ _ destrust(){ session _ write _ close();}}SessionManager构造函数主要用于连接Redis服务器,使用session_set_save_handler函数设置session回调函数,调用session_start函数启动session函数。在这个例子中,open、close和gc回调函数不是很有效,所以它们直接返回true。

在写回调函数中,会话ID作为密钥,会话的数据作为值存储到redis服务器,会话的到期时间设置为30秒。在read回调中,会话ID被用作从redis服务器读取数据并返回数据的密钥。另一方面,当销毁回调函数较重时,会话ID被用作从redis服务器删除相应会话数据的密钥。

要使用,只需包含SessionManager类并实例化一个SessionManager对象。

设置一个session_set.php文件,代码如下:

?PHP include(' session manager . PHP ');new session manager();$_SESSION['username']='船长';然后用下面的代码创建一个session_get.php文件:

?PHP include(' session manager . PHP ');new session manager();echo $ _ SESSION[' username '];在测试中,首先访问会话集php,然后访问会话set.php。输出结果如下:

再次查看redis数据库,如下所示:

127 . 0 . 0 . 1:6379 key * 1)' oe94 EIC 337 slnjv 1 bvlreoa 574 ' 127 . 0 . 0 . 1:6379 get oe94 EIC 337 slnjv 1 bvlreoa 574 ' username | s 33607: ' captain ';'测试很完美~

然后将原系统中的session_start()替换为session_set.php的前两行,成功接管,舒服了。

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

更多资讯
游戏推荐
更多+