自定义session的存储机制
<?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的存储机制的更多相关文章
- 可灵活扩展的自定义Session状态存储驱动
Session是互联网应用中非常重要的玩意儿,对于超过单台部署的站点集群,都会存在会话共享的需求.在web.config中,微软提供了sessionstate节点来定义不同的Session状态存储方式 ...
- 修改session的存储机制
<?php //修改session的存储机制 //最起码应该有一个 读方法, 和一个 写方法. //1, 我们先去建立 读方法 和 写方法. //2, 告知session系统,使用我们的方法完 ...
- php重写session的存储机制
重写session的存储机制 Session数据区 默认以 文件的形式存储与服务器操作系统临时目录中! 当 session数据区过多时,文件形式的存储,操作速度变慢.磁盘的读写(IO,input/ou ...
- 138.更改session的存储机制
修改session的存储机制: 默认情况下,session数据时存储到数据库中,当然也可以将session数据存储到其他地方.可以通过设置SESSION_ENGINE来更改session的存储位置,这 ...
- 【ASP.NET Core】自定义Session的存储方式
在开始今天的表演之前,老周先跟大伙伴们说一句:"中秋节快乐". 今天咱们来聊一下如何自己动手,实现会话(Session)的存储方式.默认是存放在分布式内存中.由于HTTP消息是无状 ...
- Session 知识点再整理(二) 自定义 Session 存储机制
对于访问量大的网站,用默认的 Session 存储方式(以文件存储)不适合,因为文件的 I/O 开销会非常大,另外 Session 机制本身使 Session 不能跨机访问,在 Web 集群中无法达到 ...
- php中session的生成机制、回收机制和存储机制探究
1.php中session的生成机制 我们先来分析一下PHP中是怎么生成一个session的.设计出session的目的是保持每一个用户的各种状态来弥补HTTP协议的不足(无状态).我们现在有一个疑问 ...
- php中session的运行机制
在PHP中session默认是以文件的形式存储于服务器的 而客户端和服务端则是通过session_id来完成握手的,默认情况下PHP会将session_id存储于cookie中,用户每次请求时该ses ...
- PHP的session的实现机制
一.默认机制,用磁盘文件来实现PHP会话.php.ini配置:session.save_handler = files 1.session_start() A. session_start()是ses ...
随机推荐
- linux下如何调试Makefile?
答:make --debug=all (输出所有的调试信息)
- linux内核中的fuse是什么?
答: 一个用户态文件系统框架,属于内核的一种特性. 1.组成部分 fuse.ko(内核模块) + libfuse.*(用户空间库) + fusemount(挂载工具) 2.参考资料 fuse.txt
- expr的字符串操作 表达式: length, index, match, substr等
参考: http://www.linuxidc.com/Linux/2012-04/58095.htm expr的格式, 主要有两个, 一是 用expr option, 选项: 二是, expr的几个 ...
- python 之 知识点(1)
在python是使用bif=built in functions 即内置函数 dir(__builtins__) 可以查看所有的内置函数.注:pycharm中无法使用,不知道原因 help(input ...
- P2519 [HAOI2011]problem a
思路 神仙思路,就差一步就能想出来了... 看到第i个人给出的条件,发现有\(a_i\)个大于,\(b_i\)个小于并不好处理 考虑把条件转化成第i个人对应的排名处理,设第i个人的排名为\(a_i+1 ...
- 到底什么是 ROI Pooling Layer ???
到底什么是 ROI Pooling Layer ??? 只知道 faster rcnn 中有 ROI pooling, 而且其他很多算法也都有用这个layer 来做一些事情,如:SINT,检测的文章等 ...
- Hive安装部署及简单测试 网页《一》
1.首先关闭机器上之前配置的分布式Hadoop 命令: (在hadoop的安装目录中) sbin/stop-dfs.sh 关闭: yarn 命令: sbin/stop ...
- 【Python】【一些概念与对比】
type.__new__() : 返回类.可以把类看作是metaclass 创建出来的实例 普通类里的__new__() : 返回类的实例. __new__() : 返回类的实例.Python解释器 ...
- JQ遇到$(‘.xxx’).attr(‘display’)一直返回undefined
jq attr && jq css 1.1 attr() 方法设置或返回被选元素的属性值 我们就题目遇到的问题做一个测试 //html <div class="div1 ...
- _itemmod_unbind
该表中的物品可以用一定代价进行解绑,解绑后可以移动,但下线将会导致物品重新绑定 `entry`物品entry `reqId` 解绑消耗模板Id `备注` 备注