<?php

class MSession implements SessionHandlerInterface
{
// reids 对象
protected $handler = null;
// 配置
protected $config = [
'host' => '127.0.0.1', // redis主机
'port' => 6379, // redis端口
'password' => '', // 密码
'select' => 0, // 操作库
'expire' => 3600, // 有效期(秒)
'timeout' => 0, // 超时时间(秒)
'persistent' => true, // 是否长连接
'session_name' => '', // sessionkey前缀
]; public function __construct($config = [])
{
$this->config = array_merge($this->config, $config);
} /**
* 类似于类的构造函数
* 当session_start()函数被调用的时候该函数被触发
*
* @param string $save_path
* @param string $name PHPSESSID
* @throws BadFunctionCallException
* @return bool
*/
public function open($save_path, $name)
{
// TODO: Implement open() method.
if (extension_loaded('redis')) {
$this->handler = new \Redis; // 建立连接
$func = $this->config['persistent'] ? 'pconnect' : 'connect';
$this->handler->$func($this->config['host'], $this->config['port'], $this->config['timeout']); if ('' != $this->config['password']) {
$this->handler->auth($this->config['password']);
} if (0 != $this->config['select']) {
$this->handler->select($this->config['select']);
}
} elseif (class_exists('\Predis\Client')) {
$params = [];
foreach ($this->config as $key => $val) {
if (in_array($key, ['aggregate', 'cluster', 'connections', 'exceptions', 'prefix', 'profile', 'replication'])) {
$params[$key] = $val;
unset($this->config[$key]);
}
}
$this->handler = new \Predis\Client($this->config, $params);
} else {
throw new \BadFunctionCallException('not support: redis');
} return true;
} /**
* 从session存储空间读取session的数据。
* 当调用session_start()函数的时候该函数会被触发
* 但是在session_start()函数调用的时候先触发open函数,再触发该函数
*
* @param string $session_id
* @return string 有数据返回session数据序列化后的字符串,若没有数据,返回空白字符串
*/
public function read($session_id)
{
// TODO: Implement read() method.
return (string)$this->handler->get($this->config['session_name'] . $session_id);
} /**
* 清除垃圾session,也就是清除过期的session。
* 该函数是基于php.ini中的配置选项
* session.gc_divisor, session.gc_probability 和 session.gc_lifetime所设置的值的
*
* @param int $maxlifetime
* @return bool
*/
public function gc($maxlifetime)
{
// TODO: Implement gc() method.
return true;
} /**
* 在session保存数据时或在脚本结束时会调用
* 在调用完此函数之后,PHP 内部会调用close函数。
*
* @param string $session_id
* @param string $session_data $_SESSION 中数据序列化之后的字符串
* @return bool
*/
public function write($session_id, $session_data)
{
// TODO: Implement write() method.
if ($this->config['expire'] > 0) {
$result = $this->handler->setex($this->config['session_name'] . $session_id, $this->config['expire'], $session_data);
} else {
$result = $this->handler->set($this->config['session_name'] . $session_id, $session_data);
} return $result ? true : false;
} /**
* 调用 session_destroy() 函数时调用
* write 和 destory互斥
*
* @param string $session_id
* @return bool
*/
public function destroy($session_id)
{
// TODO: Implement destroy() method.
return $this->handler->delete($this->config['session_name'] . $session_id) > 0;
} /**
* 类似于类的析构函数
* 当session关闭的时候该函数自动被触发
*
* @return bool
*/
public function close()
{
// TODO: Implement close() method.
$this->handler->close();
$this->handler = null;
return true;
}
}

自定义session的存储机制的更多相关文章

  1. 可灵活扩展的自定义Session状态存储驱动

    Session是互联网应用中非常重要的玩意儿,对于超过单台部署的站点集群,都会存在会话共享的需求.在web.config中,微软提供了sessionstate节点来定义不同的Session状态存储方式 ...

  2. 修改session的存储机制

    <?php  //修改session的存储机制 //最起码应该有一个 读方法, 和一个 写方法. //1, 我们先去建立 读方法 和 写方法. //2, 告知session系统,使用我们的方法完 ...

  3. php重写session的存储机制

    重写session的存储机制 Session数据区 默认以 文件的形式存储与服务器操作系统临时目录中! 当 session数据区过多时,文件形式的存储,操作速度变慢.磁盘的读写(IO,input/ou ...

  4. 138.更改session的存储机制

    修改session的存储机制: 默认情况下,session数据时存储到数据库中,当然也可以将session数据存储到其他地方.可以通过设置SESSION_ENGINE来更改session的存储位置,这 ...

  5. 【ASP.NET Core】自定义Session的存储方式

    在开始今天的表演之前,老周先跟大伙伴们说一句:"中秋节快乐". 今天咱们来聊一下如何自己动手,实现会话(Session)的存储方式.默认是存放在分布式内存中.由于HTTP消息是无状 ...

  6. Session 知识点再整理(二) 自定义 Session 存储机制

    对于访问量大的网站,用默认的 Session 存储方式(以文件存储)不适合,因为文件的 I/O 开销会非常大,另外 Session 机制本身使 Session 不能跨机访问,在 Web 集群中无法达到 ...

  7. php中session的生成机制、回收机制和存储机制探究

    1.php中session的生成机制 我们先来分析一下PHP中是怎么生成一个session的.设计出session的目的是保持每一个用户的各种状态来弥补HTTP协议的不足(无状态).我们现在有一个疑问 ...

  8. php中session的运行机制

    在PHP中session默认是以文件的形式存储于服务器的 而客户端和服务端则是通过session_id来完成握手的,默认情况下PHP会将session_id存储于cookie中,用户每次请求时该ses ...

  9. PHP的session的实现机制

    一.默认机制,用磁盘文件来实现PHP会话.php.ini配置:session.save_handler = files 1.session_start() A. session_start()是ses ...

随机推荐

  1. (转)Spring & SpringMVC学习

    https://shimo.im/docs/CzXTpHe7DlYbknEn/   掌握过程:   业务逻辑(漏洞.合理性处理).设计-->技术流程.原理.搭建.整体架设-->源码分析.断 ...

  2. hihoCoder week15 最近公共祖先·二

    tarjan求lca  就是dfs序中用并查集维护下,当访问到询问的第二个点u的时候  lca就是第一点的find(fa[v]) fa[v] = u; // 当v为u的儿子 且 v已经dfs完毕 #i ...

  3. qvalue: Check that you have valid p-values or use a different range of lambda

    ERROR: The estimated pi0 <= 0. Check that you have valid p-values or use a different range of lam ...

  4. Chrome浏览器F12开发者工具的几个小技巧总结

    1.直接修改页面元素 选择页面上元素,右键“检查”,会打开开发者工具窗口,显示当前选择元素的源代码,可以双击进行修改.如果要修改的东西比较多,可以折叠元素并单击选择,再右键Edit as HTML修改 ...

  5. (转)Introductory guide to Generative Adversarial Networks (GANs) and their promise!

    Introductory guide to Generative Adversarial Networks (GANs) and their promise! Introduction Neural ...

  6. CCF计算机网络会议日期

    SenSys: November 5-8 2017, Deadline: April 3, 2017 CoNEXT: December 12-15 2017, Deadline: June 12, 2 ...

  7. ARM MOV PC加8

    缘由 今天在分析ARM伪指令ADR,书上说ADR通常会被一条ADD或SUB指令替代实现相同功能.我反汇编了一下确实如此会基于PC相对偏移的地址量读取到寄存器中,可是计算却发现对不上 如上图所示,ADR ...

  8. forEach、map、filter、find、sort、some等易错点整理

    一.常用方法解析   说起数组操作,我们肯定第一反应就是想到forEach().map().filter()等方法,下面分别阐述一下各方法的优劣. 1.forEach 1.1 基础点   forEac ...

  9. go 一波走起

    $ go run helloworld.go 运行 $ go build helloworld.go 编译 该命令生成一个名为helloworld的可执行的二进制文件,可以随时运行它 $ ./hell ...

  10. C++.可变参数_ZC测试

    ZC:环境: Win7 x64(旗舰版),Microsoft Visual Studio 2010(版本 10.0.30319.1 RTMRel, Microsoft .NET Framework(版 ...