<?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. oracle单行函数 之 时间函数

    select  systemdate from dual --得到时间 select systemdate+300 from dual  --日期 +数字=日期,表示若干天之后的日期 select s ...

  2. 用dbms_scheduler创建job

    以前一般使用dbms_job来创建job,oracle10g以后推荐使用dbms_scheduler来创建定时任务,dbms_scheduler功能更为强大.一个创建job的例子: begin sys ...

  3. (zhuan) Some Talks about Dual Learning

    研究|对偶学习:一种新的机器学习范式  this blog copy from: http://www.msra.cn/zh-cn/news/blogs/2016/12/dual-learning-2 ...

  4. NRF24L01模块配置

    发射数据时:   (1)首先将nRF24L01配置为发射模式   (2)接着把接收节点地址TX_ADDR和有效数据TX_PLD按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低 ...

  5. Nginx配置示例

    server {listen 6080;server_name local.boheadmin; location / {proxy_pass http://127.0.0.1:8087;} loca ...

  6. Selenium Webdriver 自动化测试开发常见问题(C#版)

    转一篇文章,有修改,出处http://www.7dtest.com/site/blog-2880-203.html 1:Selenium中对浏览器的操作 首先生成一个Web对象 IWebDriver ...

  7. HDU 5459 Jesus Is Here(递推)

    http://acm.hdu.edu.cn/showproblem.php?pid=5459 题意: S(1) = c,S(2) = ff, S(3) = cff,之后S(i) = S(i-1)+S( ...

  8. 奇异分解(SVD)

    奇异分解 假设C是m×n矩阵,U是m×m矩阵,其中U的列为 的正交特征向量,V为n×n矩阵,其中V的列为 的正交特征向量,再假设r为C矩阵的秩,则存在奇异值分解: 其中和的特征值相同,为 ,且. 是m ...

  9. hdu 6199 gems gems gems dp

    gems gems gems Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) P ...

  10. SpringBoot中加密com.github.ulisesbocchio

    Jasypt Spring Boot 为 Spring Boot 项目中的属性源(property sources)提供加密支持. 有三种方法可以在项目中集成 jasypt-spring-boot: ...