PHP SESSION 自定义会话管理器

PHP中的会话管理与$_SESSION超全局数组 本文深入探讨了PHP中的浏览器会话管理,包括会话的建立、存储和检索值、以及会话的重置或销毁。通过实例解释了如何使用$_SESSION超全局数组来跟踪用户状态,如购物车和登录认证。同时,介绍了HTTP Cookie的基本知识,并通过简单的点击计数器项目,展示了如何操作会话变量。 阅读详情

前言

在遇到了 SESSION 混乱的问题后,突然对自定义会话管理器有了兴趣,于是便研究实现了一番。

分析

根据PHP官网的说明,实现方式有两种,这里准备用继承类的方式做,同时将 SESSION 存储于 Memcache 中。

实现

首先先要写一个继承于 SessionHandlerInterface 的类。

class MemcachedHanlder implements SessionHandlerInterface
{
}

在 MemcachedHanlder 类实例化的时候,附上需要连接 Memcached 的参数。

protected $_options;
protected $_memcached;
protected $_prefix;

function __construct(array $options = [])
{
    if (!isset($options['host'])) {
        $options['host'] = '127.0.0.1';
    }
    if (!isset($options['port'])) {
        $options['port'] = 11211;
    }
    if (!isset($options['persistent'])) {
        $options['persistent'] = false;
    }
    if (!isset($options['lifetime'])) {
        $options['lifetime'] = null;
    }
    $this->_prefix = isset($options['prefix']) ? $options['prefix'] : '';
    $this->_options = $options;
}

继承 SessionHandlerInterface 的类需要实现几个方法:open、close、read、write、destory 和 gc。

在 open 中连接 Memcached。

/**
 * Create new session, or re-initialize existing session
 * 
 * @param  string $path
 * @param  string $name
 * @return boolean
 */
public function open($path, $name)
{
    $options = $this->_options;
    if ($options) {
        $this->_memcached = new \Memcached($options);
        $this->_memcached->addServer($options['host'], $options['port'], $options['persistent']);
        return true;
    }
    return false;
}

/**
 * Closes the current session
 * 
 * @return integer
 */
public function close()
{
    return true;
}

/**
 * Read session data
 * 
 * @param  string $id
 * @return string
 */
public function read($id)
{
    return $this->_memcached->get($this->_prefix . $id, $this->_lifetime);
}

/**
 * Read session data
 * 
 * @param  string $id
 * @param  string $data
 * @return boolean
 */
public function write($id, $data)
{
    return $this->_memcached->set($this->_prefix . $id, $data, $this->_lifetime);
}

/**
 * Destroys a session
 * 
 * @param  string $id
 * @return boolean
 */
public function destroy($id)
{
    if (!$id && $this->_memcached->exists($this->_prefix . $id)) {
        return $this->_memcached->delete($this->_prefix . $id);
    }
    return true;
}

/**
 * Cleans up expired sessions
 * 
 * @param  string $value
 * @return boolean
 */
public function gc($maxlifetime)
{
    return true;
}

Handler 类写完之后,实例化它,并调用 session_set_save_handler 完成注册。

$options = [];
$handler = new MemcachedHanlder($options);
session_set_save_handler($handler, true);

这时候,开始畅享 SESSION 吧。

完整代码

class MemcachedHanlder implements SessionHandlerInterface
{
    protected $_options;
    protected $_memcached;
    protected $_prefix;

    function __construct(array $options = [])
    {
        if (!isset($options['host'])) {
            $options['host'] = '127.0.0.1';
        }
        if (!isset($options['port'])) {
            $options['port'] = 11211;
        }
        if (!isset($options['persistent'])) {
            $options['persistent'] = false;
        }
        if (!isset($options['lifetime'])) {
            $options['lifetime'] = null;
        }
        $this->_prefix = isset($options['prefix']) ? $options['prefix'] : '';
        $this->_options = $options;
    }

    /**
     * Create new session, or re-initialize existing session
     * 
     * @param  string $path
     * @param  string $name
     * @return boolean
     */
    public function open($path, $name)
    {
        $options = $this->_options;
        if ($options) {
            $this->_memcached = new \Memcached($options);
            $this->_memcached->addServer($options['host'], $options['port'], $options['persistent']);
            return true;
        }
        return false;
    }

    /**
     * Closes the current session
     * 
     * @return integer
     */
    public function close()
    {
        return true;
    }

    /**
     * Read session data
     * 
     * @param  string $id
     * @return string
     */
    public function read($id)
    {
        return $this->_memcached->get($this->_prefix . $id, $this->_lifetime);
    }

    /**
     * Read session data
     * 
     * @param  string $id
     * @param  string $data
     * @return boolean
     */
    public function write($id, $data)
    {
        return $this->_memcached->set($this->_prefix . $id, $data, $this->_lifetime);
    }

    /**
     * Destroys a session
     * 
     * @param  string $id
     * @return boolean
     */
    public function destroy($id)
    {
        if (!$id && $this->_memcached->exists($this->_prefix . $id)) {
            return $this->_memcached->delete($this->_prefix . $id);
        }
        return true;
    }

    /**
     * Cleans up expired sessions
     * 
     * @param  string $value
     * @return boolean
     */
    public function gc($maxlifetime)
    {
        return true;
    }
}
$options = [];
$handler = new MemcachedHanlder($options);
session_set_save_handler($handler, true);

总结

记得之前面试的时候,有人问过我 SESSION 与 COOKIE 之间的关系,SESSION 是怎么实现的,SESSION 除了存文件之外,还能够存在哪里,如何实现。

当初的我都没有回答上,想象当初真的是太年轻了,也很天真。越接触,越发现自己的渺小,越要勇往直前。

– EOF –
本文转载自IMJCW
原文链接:PHP SESSION 自定义会话管理器

告别MRT!用ArcGIS脚本批量处理MODIS数据,从HDF到NDVI/ET成品图全流程(附Python代码) 本文详细介绍了使用ArcGIS Python脚本自动化处理MODIS数据的全流程,从HDF文件提取到生成NDVI/ET成品图。通过优化子数据集提取、智能镶嵌策略和投影转换等核心步骤,大幅提升处理效率,告别传统MRT工具的手工操作。附带的Python代码可直接应用于实际项目,特别适合批量处理大规模遥感数据。 阅读详情

相关推荐

手把手教你用微信小程序实现智能硬件音视频通话(含Linux/RTOS适配)

本文详细介绍了如何利用微信小程序硬件框架(WMPF)和音视频SDK,在智能硬件(包括Linux与RTOS设备)上实现音视频通话功能。文章从架构设计、设备端SDK集成、小程序VOIP插件开发到跨平台调试与性能优化,提供了全链路实战指南,帮助开发者打通微信小程序与嵌入式设备间的实时音视频通信。

ooo22的博客 329

php中的session设置

一、php中session默认过期时间是1440S,超过这个时间没有页面刷新或者用户关闭了浏览器,session就会失效。 二、session文件存储在服务器端,通过保存在用户端的SessionId与服务器进行交互,session的配置文件是php.ini,相关参数如下: 1.session.use_cookies = 1,默认1,代表SessionId通过cookie来传递,否则会用Query

3181

演化计算(蚁群算法、粒子群算法、遗传算法、演化规则......)

演化算法1.概念2.解决的问题 1.概念 传统算法(如梯度下降法、爬山法)根据导数的性质决定迭代的方向;而演化计算是一组解在一起协同作用产生一个最优解。 2.解决的问题 预测优化:演化计算(蚁群算法、粒子群算法、遗传算法等) 解的聚散、多样性:通过多次聚散,尽快得出最优解(某个解不合要求,要能够发散出去) ...

dear_jing的博客 4162

PHP中session使用方法详解

在PHP开发中对比起Cookie,session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 session 的使用。        由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。实际上在服务器端的 Session 文件,PHP 自动修改 session 文件的权限,只保留了系统读和写权限

LonlyGod的专栏 1352

在mac OS下安装SQL Developer

最近一直在折腾Oracle数据库,但由于电脑是mac系统,plsql developer用不了,远程管理一直不是很方便。后来听说Navicat不错,就也装了个试试看,发现界面看起来确实不错。今天心血来潮,想试试oracle自己开发的client。用惯plsql developer的人也可以来试试看,毕竟是自己人开发的,兼容性应该会不错吧。下面就把安装过程分享给新手或者需要帮助的朋友。 1.

bonbonboo的专栏 2万+

立创开源:基于STM32F103与ADS1256的六维力传感器低成本实现方案

本文详细介绍了一种基于STM32F103微控制器与ADS1256高精度ADC的低成本六维力传感器实现方案。该方案通过3D打印的六梁弹性体结构结合应变片,将多维力信号转换为电信号,并由24位ADC进行高精度采集。文章涵盖了硬件选型、电路设计、嵌入式软件驱动及上位机数据可视化全流程,为机器人、精密测量等领域的爱好者提供了一个可复现的开源实践参考。

weixin_34718952的博客 390

(十二)自定义session管理

easyopen1.4.0开始支持自定义session管理。 创建session 登陆成功后创建session,并返回sessionId // 自定义session @PostMapping("managedSessionLogin") public String managedSessionLogin(HttpServletRequest request) { ...

axe的专栏 1857

我写了一个自动识别火车车厢位置的算法【lidar点云识别】

我写了一个自动识别火车车厢位置的算法【lidar点云识别】

qq_43212290的博客 798

自定义会话管理器->SESSION

慕课学习-->PHP中的会话控制-->第三章 SESSION的使用-->3-5自定义会话管理器 <?php class CustomSession implements SessionHandlerInterface{ private $links; private $lifetime;//生存周期 public function open($savePath,$session_name)

muzi187的博客 440

【RH850/U2A】:功能安全

功能安全相关

3130

端侧 AI 落地避坑指南(中):为什么 QAT 救不了精度?——对齐“融合后算子“的硬件物理约束

在上一篇文章中,我们深入探讨了量化的本质,并得出结论:QAT(量化感知训练)是保持精度的关键。明明做了 QAT,精度还是崩塌了!让我们看一个真实的案例:✅ 使用了✅ 配置了量化✅ 训练了 50 个 epoch,学习率降为原来的 1/10✅ 冻结了 BN 统计量FP32 模型:mAP = 0.85QAT 后 FP32:mAP = 0.84(正常)工具量化后:mAP = 0.68(崩塌!问题出在哪里?层融合(Layer Fusion)机制。

weixin_51988935的博客 55

php的session机制以及自定义会话管理器

如果需要在数据库中或者以其他方式存储会话数据, 需要使用 session_set_save_handler() 函数来创建一系列用户级存储函数。 PHP 5.4.0 之后,你可以使用 SessionHandlerInterface 类 或者通过继承 SessionHandler 类来扩展内置的管理器, 从而达到自定义会话保存机制的目的。 函数 session_set_save_han

2> /dev/null 1371

基于Gossip算法的柔性互联自治微网群分布式协调控制策略:复现代码与详细解释

摘要(149字): 本文基于Gossip算法实现了柔性互联微网群(MMG)的分布式协调控制策略仿真。研究构建了包含3个微网、10个分布式电源(DG)的MATLAB/Simulink模型,采用双层控制架构:上层通过柔性交流开关(FAS)实现微网间功率协调,下层利用Gossip算法完成DG间的边际成本一致性控制。重点开发了异步通信的Gossip算法核心函数,实现了分布式电源的自主边际成本估计与功率分配。仿真验证了系统在负荷变化和DG故障等工况下的协调控制能力,结果表明该策略能有效维持微网群的经济运行与功率平衡。

huanghm88的专栏 281

PHP 自定义session会话管理器

前言 session的默认存储器是文件形式,每新建一个会话,都会在我们磁盘中产生一个新会话的文件。 如果说我们的网站用户是千万级的,每个用户在登录的时候都会产生一个会话文件,那我们的磁盘中是不是有千万级的会话文件.当用户第二次再来访问时,查询指定的session_id,需要在这个千万个文件中来查找这一个,那这个速度会是很慢的.所以说默认基于文件的形式存储它的性能不是很好,这时候我们就要考虑使用我们自定义的方式来存储session数据 ...

weixin_44035459的博客 268

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

php session全局管理,PHP SESSION 自定义会话管理器

前言在遇到了 SESSION 混乱的问题后,突然对自定义会话管理器有了兴趣,于是便研究实现了一番。分析根据PHP官网的说明,实现方式有两种,这里准备用继承类的方式做,同时将 SESSION 存储于 Memcache 中。实现首先先要写一个继承于 SessionHandlerInterface 的类。class MemcachedHanlder implements SessionHandlerIn...

weixin_35157304的博客 182

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

php session管理器,php的session机制以及自定义会话管理器

为了清理会话中的旧数据,PHP 会不时的调用垃圾收集回调函数。 调用周期由session.gc_probability和session.gc_divisor参数控制。 传入到此回调函数的 lifetime 参数由session.gc_maxlifetime设置。 此回调函数操作成功返回TRUE,反之返回FALSE。SESSION 的数据保存在哪里呢? 当然是在服务器端,但不是保存在内...

weixin_39639049的博客 135

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

php 会话管理器,数据库存放session,自定义会话管理器

要求>=php5.4sessions表session_idsession_datasession_expiresxxxxxxxxx//CustomSession.phpclass CustomSession implements SessionHandlerInterface{private $link;private $lifetime;public function open($save...

weixin_30338049的博客 149

PHP中SESSION自定义会话管理器

<?php class CustomSession implements SessionHandlerInterface{ private $link; private $lifetime; public function open($savePath,$session_name){ $this->lifetim...

weixin_30657541的博客 96

PHP实战之Session会话控制

精选30+云产品,助力企业轻松上云!>>> 目...

六道有言的博客 663

php的Session和Cookie存储流程理解

php程序的Session和Cookie存储流程学习和理解

oraclechaozi的专栏 768

PHP中session_start函数偶尔很慢

最近在写前后端分离项目时,使用xhprof对代码进行性分析,发现偶尔有些请求特别慢。追调用栈定位到是session_start函数的原因。查阅官方手册发现在session_start后会有文件锁,所以并发请求时容易出现再次调用session_start函数时会耗时很长的现象。 解决办法: 1.在session_start函数参数中使用read_and_close选项(参见官方手册) 2.通过

Never land 2899

了解SESSION知识

官方链接:https://www.php.net/manual/zh/book.session.php 基本用法:https://www.php.net/manual/zh/session.examples.basic.php 通过为每个独立用户分配唯一的会话 ID,可以实现针对不同用户分别存储数据的功能。 会话通常被用来在多个页面请求之间保存及共享信息。 一般来说,会话 ID 通过 cook...

chaoyang_test的专栏 299

深入浅出:PHP会话管理(Session 和 Cookie)

会话管理是指在Web应用程序中维护用户状态的技术。由于HTTP协议是无状态的,每次请求都是独立的,服务器无法自动识别同一用户的连续请求。为了克服这个问题,我们可以使用Cookie和Session来存储和传递用户信息,从而实现跨页面的状态保持。本文详细介绍了PHP中的会话管理机制,包括Cookie和Session的基本概念、设置和读取方法、安全性考虑以及综合案例。通过对每个知识点的解释和示例演示,希望你能更加熟练地运用这些工具,写出更加安全和高效的Web应用程序。

软件架构师笔记 1384

PHP的会话管理是如何工作的?

PHP的会话管理(Session)是一种在服务器端跟踪用户会话信息的技术,其工作原理可以分为以下几个步骤:当客户端首次访问服务器时,PHP会检查是否有已存在的会话ID(Session ID)。如果没有,则通过调用函数来创建一个新的会话,并生成一个唯一的Session ID。这个ID通常存储在客户端的Cookie中。PHP通过HTTP响应头将生成的Session ID发送到客户端浏览器,并保存在Cookie中。这样,当用户再次访问时,浏览器会自动携带这个Session ID发送给服务器。在后续的请求中,服务器

破损的天堂鸟博客 936

什么是PHP中的会话管理?

在PHP中,会话管理是一种用于跟踪和识别用户活动的技术,从而提供个性化的体验。它允许服务器在不同的HTTP请求之间存储和检索数据,确保用户状态信息的持久化和安全性。会话管理主要依赖于会话ID(Session ID)、会话数据以及会话存储机制来实现。会话ID是一个加密的随机数字,由PHP生成,并在会话的生命周期中保存在客户端。它可以保存在用户的Cookie中,或者通过URL在网络上传递。默认情况下,会话变量存储在服务器上的平面文件中,但也可以更改为使用数据库。要启用会话管理,通常需要在脚本开头调用。

破损的天堂鸟博客 1161

php会话管理实验总结,PHP会话管理_Session会话

一、了解SessionSession从用户访问页面开始,到断开与网站连接为止,形成Session的生命周期。用户每一次连接时,PHP都会自动生成一个唯一的SessionID以标识当前用户,与其他用户进行区分。在会话期间,PHP默认生成名为PHPSESSIONID的标识(该名称可以在php.ini文件中更改),它伴随每一个页面被送往浏览器,然后随下一次页面请求返回给Web服务器。SessionID可...

weixin_35835018的博客 430
上一篇: Phalcon只更新改变的字段
下一篇: 字符串字符分割和驼峰形式的转换
IMJCW
博客等级 码龄10年 13粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值