session共享 之 session入库
来源:互联网 发布:python 文本相似度 编辑:程序博客网 时间:2024/05/21 17:41
我们知道,session是一种会话技术,用来实现跨脚本共享数据。
在之前的php会话技术中我们介绍过,session是存放在服务器端的文件里的,因此session有可能因为文件数量过多,会在查询session文件以及读取的时候产生压力。一般我们有三种解决方案
1.使用文件分层(缺点:I/O操作是系统的一个瓶颈,即使分层也不能避免此问题)
2.将session放入数据库
3.将session放在内存中(非关系性数据库)(缺点:对服务器内存要求教高)
因此我们选用一个折中的办法,将session存入mysql数据库,也就是我们要讲的重点,
session入库技术:
要实现session入库,首先我们要了解session 机制:
什么是session机制:
在php中,session可以理解为一套单独的小系统,在该系统中有很多关于session的处理方法,用来解决各种问题,用户只需要在session之外,调用session_start函数(session系统的一个接口)
其他操作都是session系统帮忙去处理
由图可知我们应该修改session机制中的session的读取和最终的写入。
要修改session机制要借助一个系统函数
session_set_save_handler():用来使用外部用户定义的函数,来取代session系统本身的函数。
session_set_save_handler(开启session机制函数,关闭session机制函数,读取session数据函数,写入session函数,销毁session函数,后手过期session函数)。
因此我们要准备六个函数。
代码实现:
<?php //session入库 //以为修改session机制必须借助session_set_save_handler()函数,该函数需要6个可以调用的回调函数,因此需要创建6个人对应的函数 //1.开启session机制 function sess_open() { //开启资源 //连接数据库 mysql_connect('localhost','root',''); mysql_query('set names utf8'); mysql_query('use session'); echo __FUNCTION__,'<br/>'; //测试输出 } //2.关闭session function sess_close() { //关闭资源 mysql_close(); echo __FUNCTION__,'<br/>'; } //3.读取session function sess_read($sess_id) { //从数据库读取数据 //根据sess_id(由系统提供)获取数据 //读数据时要过滤掉过期的数据 $expire=time()-ini_get('session.gc_maxlifetime'); $sql="selsct * from session where sess_id='{$sess_id}' and sess_expire>='{$expire}'"; $res=mysql_query($sql); //得到的是一个数组 if($sess=@mysql_fetch_assoc($res)) { //得到一个序列化后的字符串 //要进行反序列化,read只负责读取数据,不负责加工数据 return $sess['sess_info']; } echo __FUNCTION__,'<br/>'; } //4.写入session function sess_write($sess_id,$sess_info) { //向数据库中写入数据 $time=time(); $sql="replace into session values('{$sess_id}','{$sess_info}','{$time}')"; mysql_query($sql); echo __FUNCTION__,'<br/>'; } //5.销毁session function sess_destroy($sess_id) { $sql="delete from session where sess_id='{$sess_id}'"; return mysql_query($sql); echo __FUNCTION__,'<br/>';} //6.回收session function sess_gc() { //从数据库删除过期的session数据 //判断session是否过期,过期的删除 $expire=ini_get('session.gc_maxlifetime'); //得到最迟的时间,在$expire之前的都是过期的 $expire=time()-$expire; $sql="delete from session where sess_expire < '{expire}'"; return mysql_query($sql); echo __FUNCTION__,'<br/>'; } //使用session_set_save_handler()修改session机制 session_set_save_handler('sess_open','sess_close','sess_read','sess_write','sess_destroy','sess_gc'); //想要使用session,必须要用session_start()来开启 session_start(); $_SESSION['name']='wangqixing'; $_SESSION['age']='23'; //session_destroy();
0 0
- session共享 之 session入库
- PHP之session入库
- session入库
- session入库
- session入库
- session入库
- session入库
- Session入库
- session 入库
- session入库
- session入库
- session入库
- session入库
- session入库
- session入库
- session入库
- session入库
- session入库
- 使用Controls进行zoom事件时,不改变指定物体在视野中的大小(一)
- jQuery ajax教程 入门程序
- Android Studio(十一):代码混淆及打包apk
- JavaScript点击事件加卸载事件完美版!
- 最短路径(邻接表)-Dijkstra算法
- session共享 之 session入库
- java的三大特征封装,继承,多态的理解
- linux学习记录
- hive中的错误(missing EOF at )
- 自定义打印方法
- StringBuffer与StringBuilder的区别
- loading的实现(css3)
- Spring JPA 复杂条件查询
- IntelliJ IDEA