php 清除指定session,PHP如何操作指定的session?
如果你使用 php 原生 的 session 实现的话。
搞清楚两个问题
你需要知道原生php在进行session操作的时候的生命周期。[php.session] 文档。
还要有一套具体实现流程。
来说说以上两个问题。
第一个问题
英文原文:
The callbacks specified in session_set_save_handler() are methods called by PHP during the life-cycle of a session: open, read, write and close and for the housekeeping tasks: destroy for deleting a session and gc for periodic garbage collection.
大意就是说,通过session_set_save_handler() 来指定一些回调方法,来供php在他的生命周期中调用。php 操作session的生命周期(life-cycle),分别为 open, read, write, close。在日常开发过程中,销毁 (destroy) 一个session,session垃圾清理机制会定期的去清理。(关于session的垃圾清理你可以在,php.ini文件中配置)
php默认管理sessiopn的方式是以文件形式存放在本地的硬盘上。(虽然很低效,但是很实用)以session_id作为文件名,文件的内容就是session中序列化的内容。
方法定义
bool session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid ] )
在 php 5.4.0 你可以通过实现 SessionHandlerInterface 接口或继承 SessionHandler 类来使用。
如果想使用自定义生成 session_id 的功能还要实现 SessionIdInterface。
session_set_save_handler
As of PHP 5.4.0 you may create session handlers using the SessionHandlerInterface or extend internal PHP handlers by inheriting from SessionHandler。
继承SessionHandler可以在系统默认的实现上做一些修改。实现SessionHandlerInterface需要完全重写php默认的session管理方式。
他们的特点就是你可以继续使用 session_start, session_id, $_SESSION 而无需理会他们底层是怎么实现的。
本人一直反对在 php 语言发行版中搭载 http 的功能。这使得php变得很笨重不容易扩展,我也从不使用php原生的http功能。我现在的php版本是5.4。在开发php项目中,我大多数是使用 symfony2 框架或 symfony2 httpfoundation bundle。
第一个问题就搞定了,来看看第二个问题
第二个问题, 具体实现流程
如果我们 使用 session_set_save_handler 方法。通过它我们就可以管理每一个session。
我们可以在每一session创建的时候,把session的id记录下来。
php// 一下以文件系统作为存储介质实现一个简单的 `session handler`
class MySessionHandler extends SessionHandler implements SessionIdInterface {
private $key;
private $savePath;
public function __construct($key)
{
$this->key = $key;
$this->savePath = session_save_path();
}
public function create_sid() {
// 生成 session id
$session_id = uniqid('sess_', true);
// 关键点 存储这个 id
db_store('session_ids', $session_id);
return $session_id;
}
// 通过 session id 读取 session 中数据的方法
public function read($id)
{
$data = parent::read($id);
return mcrypt_decrypt(MCRYPT_3DES, $this->key, $data, MCRYPT_MODE_ECB);
}
// 修改session中数据的方法
public function write($id, $data)
{
$data = mcrypt_encrypt(MCRYPT_3DES, $this->key, $data, MCRYPT_MODE_ECB);
return parent::write($id, $data);
}
// 简单实现,最好清除一下客户端 session_cookie
public function destroy($id) {
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}
}
// main fun
// config
ini_set('session.save_handler', 'files');
ini_set('session.save_path', './data/sessions'); //将 session 文件保存在项目中
// 实例化 handle
$handler = new MySessionHandler('mykey');
// 应用 handle
session_set_save_handler($handler, true);
// 可以使用 $handler 是完成一切工作
遗憾的是 session_set_save_handler 方法在 php5.5.1 版本之前并没有去管理生成 session_id,也就是实现 create_sid 方法是没有用的,因为 php5.5.1 之前的版本没有 SessionIdInterface 接口 session_set_save_handler 方法也没有对此接口做调整。
这也是我为什么不用 php 原生http的原因之一,如果使用symfony2的话,几乎没有任何限制,应为一切都是从 php://input 开始 从 php://output结束。
不废话了。
使用 handler 你就可以实现上面那样管理 session 用户。
php// 获取一个 session id
$a_sess_id = db_query('session_ids')[0];
// 获取session数据
$sess_data = $handler->read($a_sess_id);
// 修改这个session
$handler->write($a_sess_id, $new_data);
// 销毁这个 session
$handler->destroy($a_sess_id, $new_data);
希望对你有多帮助,还有建议所有看到这个"文章"(就叫文章吧)的朋友不要在使用 php 原生 http 的功能了,$_GET, $_SERVER, $_COOKIES, $_SESSION 等等如此,真的很丑陋,他是php万恶的根源之一。
[symfony HttpFoundation] 项目告诉你我们应该如何正确的使用php开发web。当然你最好直接使用 symfony
php 清除指定session,PHP如何操作指定的session?相关推荐
- vue 获取数组索引_vue 重塑数组之修改数组指定index的值操作
如下所示: vm.items[indexofitem] = newvalue vue不能检测数组的变动 想要实现可以使用vue的set方法 this.$set(this.items,indexofit ...
- Transformations on DStreams之transform的使用 实现黑名单操作/指定过滤
Transformations on DStreams之transform 实现黑名单操作/指定过滤 官网:http://spark.apache.org/docs/latest/streaming- ...
- android saf 打开指定目录,并操作相关文件
android saf 打开指定目录,并操作相关文件 saf存储访问框架(android 4.4 引入)全称 Storage Access Framework 用户可轻松在其所有首选文档存储提供程序中 ...
- 客户手动调节音量的范围,修改默认音量各类型音量,按音量键或手动调进度条触发流程,调节音量大小级数每次加减的级数,同时操作指定多个音量类型,更改开机音量,通过底层节点来调节音量大小,音量控制的对话框UI
frameworks/base/services/core/java/com/android/server/audio/AudioService.java 客户手动调节音量的范围:就是按音量键出来的进 ...
- cmd中到指定目录去的操作
关于cmd中到指定目录去的操作 1. 打开cmd之后,默认的地址为C:\Users\dell> 2. 如果想从该地址转到如F:\指定目录,非C,则正确的操作为输入:cd /d F: 大功告成啦! ...
- java某个参数值设置为空_@PathVariable为空时指定默认值的操作
@PathVariable为空时指定默认值, 可以指定多个匹配路径,然后设置参数非必要的,就可以了,例子如下 @RequestMapping(value = {"/timeline/{uid ...
- spring 获取cookies_springMVC操作cookie和session
cookie相关说明: 1.cookie由服务器端创建,然后添加到HttpServletResponse中发送给客户端(浏览器). 2.可以添加多个cookie键值对. 3.cookie由键值名和键值 ...
- SpringBoot 2 整合 Spring Session 最简操作
SpringBoot 2 整合 SpringSession 前言 Spring Session 介绍 SpringBoot 快速整合 Spring Session Spring Session 测试 ...
- python/数据库操作补充—模板—Session
python/数据库操作补充-模板-Session 一.创建一个app目录 在models.py只能类进行进行创建表 1 class Foo: 2 xx= 字段(数据库数据类型) 3 字段类型 4 字 ...
最新文章
- 内网渗透-域内信息收集
- 在python3.x下使用如下代码: import cPickle as pk 报错
- 服务器开机忘记密码怎么修改,服务器忘记mysql密码怎么修改?
- composition 组合
- java array使用_Java_ArrayLit详细用法
- 机器学习代码实战——朴素贝叶斯(实现垃圾邮件分类)
- Javascript中eval函数的用法
- cesium接入加载倾斜摄影(cesium篇.16)
- linux脚本设置字体颜色,xshell设置字体及背景颜色方法详细教程
- python爬虫之三 —— 淘宝评论
- 你可能不知道的Gmail分身小技巧
- 网络安全先驱传奇自杀了,他的一生足够拍成一部电影
- 小红书爆款笔记推送周期是多久?做小红书是视频好还是图文好
- iphone手机设置自定义歌曲为铃声教程
- Hibernate中No row with the given identifier exis
- 小程序云开发(一):新建云开发模板
- 家乡,属于梦的记忆140
- 托福百日冲刺(五一记忆)(1)
- map写入文件及从文件读出
- java分层窗格_Swing拆分窗格控件JSplitPane使用详解
热门文章
- 数据可视化的图表实现
- androidwear环境搭建以及android进入之后出现(Error:Failed to resolve: com.android.support:support-v4:26.0.0)
- python session模块_Python backend.set_session方法代码示例
- mysql fm999990.99999_Oracle如何显示小数点前面的0
- 直播笔记 | Unity中路径的疑难杂症剖析
- OpenShift 4之唤醒休眠的OpenShift应用
- (二)使用CycleGAN进行移动风格迁移
- 实现机器学习的循序渐进指南IX ——树回归
- win10一直正在检查更新_听说每个新时代的网民,都被win10迫害过
- java enumset_Java EnumSet工作原理初窥