如果你使用 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?相关推荐

  1. vue 获取数组索引_vue 重塑数组之修改数组指定index的值操作

    如下所示: vm.items[indexofitem] = newvalue vue不能检测数组的变动 想要实现可以使用vue的set方法 this.$set(this.items,indexofit ...

  2. Transformations on DStreams之transform的使用 实现黑名单操作/指定过滤

    Transformations on DStreams之transform 实现黑名单操作/指定过滤 官网:http://spark.apache.org/docs/latest/streaming- ...

  3. android saf 打开指定目录,并操作相关文件

    android saf 打开指定目录,并操作相关文件 saf存储访问框架(android 4.4 引入)全称 Storage Access Framework 用户可轻松在其所有首选文档存储提供程序中 ...

  4. 客户手动调节音量的范围,修改默认音量各类型音量,按音量键或手动调进度条触发流程,调节音量大小级数每次加减的级数,同时操作指定多个音量类型,更改开机音量,通过底层节点来调节音量大小,音量控制的对话框UI

    frameworks/base/services/core/java/com/android/server/audio/AudioService.java 客户手动调节音量的范围:就是按音量键出来的进 ...

  5. cmd中到指定目录去的操作

    关于cmd中到指定目录去的操作 1. 打开cmd之后,默认的地址为C:\Users\dell> 2. 如果想从该地址转到如F:\指定目录,非C,则正确的操作为输入:cd /d F: 大功告成啦! ...

  6. java某个参数值设置为空_@PathVariable为空时指定默认值的操作

    @PathVariable为空时指定默认值, 可以指定多个匹配路径,然后设置参数非必要的,就可以了,例子如下 @RequestMapping(value = {"/timeline/{uid ...

  7. spring 获取cookies_springMVC操作cookie和session

    cookie相关说明: 1.cookie由服务器端创建,然后添加到HttpServletResponse中发送给客户端(浏览器). 2.可以添加多个cookie键值对. 3.cookie由键值名和键值 ...

  8. SpringBoot 2 整合 Spring Session 最简操作

    SpringBoot 2 整合 SpringSession 前言 Spring Session 介绍 SpringBoot 快速整合 Spring Session Spring Session 测试 ...

  9. python/数据库操作补充—模板—Session

    python/数据库操作补充-模板-Session 一.创建一个app目录 在models.py只能类进行进行创建表 1 class Foo: 2 xx= 字段(数据库数据类型) 3 字段类型 4 字 ...

最新文章

  1. 内网渗透-域内信息收集
  2. 在python3.x下使用如下代码: import cPickle as pk 报错
  3. 服务器开机忘记密码怎么修改,服务器忘记mysql密码怎么修改?
  4. composition 组合
  5. java array使用_Java_ArrayLit详细用法
  6. 机器学习代码实战——朴素贝叶斯(实现垃圾邮件分类)
  7. Javascript中eval函数的用法
  8. cesium接入加载倾斜摄影(cesium篇.16)
  9. linux脚本设置字体颜色,xshell设置字体及背景颜色方法详细教程
  10. python爬虫之三 —— 淘宝评论
  11. 你可能不知道的Gmail分身小技巧
  12. 网络安全先驱传奇自杀了,他的一生足够拍成一部电影
  13. 小红书爆款笔记推送周期是多久?做小红书是视频好还是图文好
  14. iphone手机设置自定义歌曲为铃声教程
  15. Hibernate中No row with the given identifier exis
  16. 小程序云开发(一):新建云开发模板
  17. 家乡,属于梦的记忆140
  18. 托福百日冲刺(五一记忆)(1)
  19. map写入文件及从文件读出
  20. java分层窗格_Swing拆分窗格控件JSplitPane使用详解

热门文章

  1. 数据可视化的图表实现
  2. androidwear环境搭建以及android进入之后出现(Error:Failed to resolve: com.android.support:support-v4:26.0.0)
  3. python session模块_Python backend.set_session方法代码示例
  4. mysql fm999990.99999_Oracle如何显示小数点前面的0
  5. 直播笔记 | Unity中路径的疑难杂症剖析
  6. OpenShift 4之唤醒休眠的OpenShift应用
  7. (二)使用CycleGAN进行移动风格迁移
  8. 实现机器学习的循序渐进指南IX ——树回归
  9. win10一直正在检查更新_听说每个新时代的网民,都被win10迫害过
  10. java enumset_Java EnumSet工作原理初窥