前言
首先说一下,原版session实际并不是很烂,如果你的项目不是高并发项目,完全可以使用原版session。
PHP默认的session是以文件形式保存在本地磁盘上的,每次访问实际就是一次io操作,并发大时必定会影响服务器速度。
使用cookie代替session,这个我也不太建议,首先cookie是保存在客户端上的,很容易被篡改,如果使用加密确保cookie的完整性,那么cookie保存的数据就会变得越多,就越容易消耗带宽。
而使用内存代替文件储存session就成为现在的主流。
使用Redis替代文件存储Session
session_set_save_handler
该函数定义用户级session保存函数(如打开、关闭、写入等)。
编写一个session管理类sessionManager.php ,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | <?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类,然后实例化一个SessionManager对象。下面建立个session_set.php文件。
1 2 3 4 | <?php include ( 'SessionManager.php' ); new SessionManager(); $_SESSION [ 'username' ] = 'captain' ; |
然后再创建一个session_get.php文件,输入如下代码:
1 2 3 4 5 | <?php include ( 'SessionManager.php' ); new SessionManager(); echo $_SESSION [ 'username' ]; //print captain |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?