php session基本原理解析

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: php session基本原理解析

该类实现了php session的基本原理操作

由于session比较简单,直接封装出了session的基本操作

<?php
/**
 * Created by PhpStorm.
 * User: 10671
 * Date: 2018/6/22
 * Time: 23:48
 */
class SessionHandle
{
    private static $_instance;
    private $config = array(
        'cookie\_name' => 'session\_id',
        'cookie_path' => '',
        'cookie_domain' => '',
        'cookie_secure' => false,
        'save\_path' => \_\_DIR__ . DIRECTORY\_SEPARATOR . 'runtime' . DIRECTORY\_SEPARATOR,//保存路径
        'save\_path\_num' => 5,//保存目录数(以免造成一个目录太多session文件,0则保存在当前目录)
        'cache_expire' => 30 * 60,//过期时间
        'session_handler' => null,
        'gc_probability' => 1//触发垃圾回收概率1/100
    );
    public $path_dictionary = array(
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
    );
    public function __construct($config = array())
    {
        foreach ($config as $key => $value) {
            if (isset($this->config\[$key\])) {
                $this->config\[$key\] = $value;
            }
        }
    }
        public function __destruct()
        {
            $this->saveSession();
        }
    /**
     * 单例
     * @return SessionHandle
     */
    public static function getInstance($config=array())
    {
        if (!(self::$_instance instanceof self)) {
            self::$_instance = new static($config); //new static和new self区别可查看http://www.jb51.net/article/54167.htm
        }
        return self::$_instance;
    }
    /**
     * 开始设置session
     */
    public function startSession($session_id = null)
    {
        if (is\_callable($this->config\['session\_handler'\])) {
            return $this->config\['session\_handler'\]('start\_session');
        }
        if (mt\_rand(1, 100) <= $this->config\['gc\_probability'\]) {
            $this->gc();
        }
        if (!isset($\_COOKIE\[$this->config\['cookie\_name'\]\])) {
            $session\_id === null && $session\_id = $this->getSessionId();
            $this->setCookie($session_id);
            $this->saveSessionData($session_id, array());
        } else {
            $session\_id = $\_COOKIE\[$this->config\['cookie_name'\]\];
        }
        return $data = $\_SESSION = $this->getSessionData($session\_id);
    }
    /**
     * 设置
     * @param $session_id
     * @param $name
     * @param $value
     */
    public function setSession($name, $value, $session_id = null)
    {
        $session\_id === null && $session\_id = $this->getSessionId();
        $data = $this->getSessionData($session_id);
        if (empty($name)) {
            return false;
        }
        if ($value == null) {
            unset($data\[$name\]);
        }
        $data\[$name\] = $value;
        $result = $this->saveSessionData($session_id, $data);
        if ($result === false) {
            return $result;
        }
        return $_SESSION = $data;
    }
    /**
     * 保存数据到文件
     * @param null $session_id
     * @param null $data
     * @return bool|int|null
     */
    public function saveSession($session_id=null,$data=null){
        $session\_id === null && $session\_id = $this->getSessionId();
        $data === null && $data = $_SESSION;
        if (is\_callable($this->config\['session\_handler'\])) {
            return $this->config\['session\_handler'\]('save\_session', $session_id);
        }
        $result = $this->saveSessionData($session_id, $data);
        if ($result === false) {
            return $result;
        }
        return $_SESSION = $data;
    }
    /**
     * 删除
     * @param null $session_id
     * @return bool
     */
    public function deleteSession($session_id = null)
    {
        $session\_id === null && $session\_id = $this->getSessionId();
        $result = $this->deleteSessionData($session_id);
        $this->setCookie('');
        $_SESSION = array();
        return $result;
    }
    /**
     * 设置cookie
     * @param $session_id
     */
    public function setCookie($session_id)
    {
        setcookie($this->config\['cookie\_name'\], $session\_id, time() + $this->config\['cache\_expire'\], $this->config\['cookie\_path'\], $this->config\['cookie\_domain'\], $this->config\['cookie\_secure'\]);
    }
    /**
     * 获取session_id
     * @param $session_id
     * @return mixed
     */
    public function getSessionData($session_id)
    {
        if (is\_callable($this->config\['session\_handler'\])) {
            return $this->config\['session\_handler'\]('read', $session\_id);
        }
        $this->updateSessionIndex($session_id);
        $data = serialize(array());
        if (file\_exists($this->getSessionIDPath($session\_id))) {
            $data = file\_get\_contents($this->getSessionIDPath($session_id));
        }
        return unserialize($data);
    }
    /**
     * 修改保存
     * @param $session_id
     * @param $data
     * @return bool|int
     */
    public function saveSessionData($session_id, $data)
    {
        if (is\_callable($this->config\['session\_handler'\])) {
            return $this->config\['session\_handler'\]('save', $session\_id, $data);
        }
        $this->updateSessionIndex($session_id);
        $result = file\_put\_contents($this->getSessionIDPath($session_id), serialize($data));
        return $result;
    }
    /**
     * 删除文件
     * @param $session_id
     * @return bool
     */
    public function deleteSessionData($session_id)
    {
        if (is\_callable($this->config\['session\_handler'\])) {
            return $this->config\['session\_handler'\]('delete', $session\_id);
        }
        return unlink($this->getSessionIDPath($session_id));
    }
    /**
     * 设置session处理
     * @param callable $function
     */
    public function setSessionHandler(callable $function)
    {
        $this->config\['session_handler'\] = $function;
    }
    /**
     * 获取sessionid的路径
     * @param $session_id
     * @return string
     */
    public function getSessionIDPath($session_id)
    {
        if (abs($this->config\['save\_path\_num'\]) == 0) {
            $path = $this->config\['save_path'\];
        } else {
            $path = $this->config\['save\_path'\] . $this->path\_dictionary\[$this->time33($session\_id) % $this->config\['save\_path\_num'\]\] . DIRECTORY\_SEPARATOR;
        }
        if (!is_dir($path)) {
            @mkdir($path);
        }
        return $path . $session_id;
    }
    /**
     * 垃圾回收
     * @return bool|int
     */
    public function gc()
    {
        if (is\_callable($this->config\['session\_handler'\])) {
            return $this->config\['session_handler'\]('gc');
        }
        if ($this->config\['cache_expire'\] <= 0) {
            return true;
        }
        $session\_index\_path = $this->config\['save_path'\] . 'index';
        $session\_index = unserialize(file\_get\_contents($session\_index_path));
        foreach ($session\_index as $session\_id => $value) {
            if ($value + $this->config\['cache_expire'\] < time()) {
                unset($session\_index\[$session\_id\]);
                @unlink($this->deleteSessionData($session_id));
            }
        }
        $result = file\_put\_contents($session\_index\_path, serialize($session_index));
        return $result;
    }
    /**
     * 更新session索引
     * @param null $session_id
     */
    public function updateSessionIndex($session_id = null)
    {
        if (is\_callable($this->config\['session\_handler'\])) {
            return $this->config\['session\_handler'\]('update\_session\_index', $session\_id);
        }
        if ($this->config\['cache_expire'\] <= 0) {
            return true;
        }
        $session\_id === null && $session\_id = $this->getSessionId();
        $session\_index\_path = $this->config\['save_path'\] . 'index';
        $session_index = array();
        if (file\_exists($session\_index_path)) {
            $session\_index = unserialize(file\_get\_contents($session\_index_path));
        }
        $session\_index\[$session\_id\] = time();
        $result = file\_put\_contents($session\_index\_path, serialize($session_index));
        return $result;
    }
    /**
     * 生成一个尽量唯一的字符串
     */
    public function getSessionId()
    {
        $session_id = null;
        if (isset($\_COOKIE\[$this->config\['cookie\_name'\]\])) {
            $session\_id = $\_COOKIE\[$this->config\['cookie_name'\]\];
        }
        if (empty($session_id)) {
            if (is\_callable($this->config\['session\_handler'\])) {
                return $this->config\['session\_handler'\]('create\_session_id');
            }
            $key = uniqid(mt_rand(100000, 999999));
            $session_id = $this->md5($key);
        }
        return $session_id;
    }
    public function md5($str)
    {
        $hash = md5($str);
        return $hash;
    }
    public function time33($str)
    {
        $hash = 0;
        $s = md5($str);
        $len = 32;
        for ($i = 0; $i < $len; $i++) {
            $hash = ($hash * 33 + ord($s{$i})) & 0x7FFFFFFF;
        }
        return $hash;
    }
}

该类实现了php基本的session原理

调用方法:

include 'SessionHandle.php';
$session_handle = SessionHandle::getInstance();
//var\_dump($session\_handle);
$session_handle->startSession();
//$session_handle->deleteSession();
//$session_handle->setSession('name','ncl');
var\_dump($\_SESSION);
目录
相关文章
|
6月前
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
225 67
|
10月前
|
安全 算法 网络协议
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
|
6月前
|
运维 监控 算法
局域网屏幕监控软件 PHP 图像块增量传输算法解析
本文探讨了一种基于PHP语言开发的图像块增量传输算法,适用于局域网屏幕监控场景。通过将屏幕图像分块处理、计算哈希值并对比变化区域,该算法显著降低了网络带宽占用,提升了监控效率。在企业管理和远程教育中,该技术可实现终端设备的实时监控与远程管控,同时支持与生物识别等技术融合,拓展应用范围。实验表明,该算法在常规办公场景下可减少90%以上的数据传输量,展现了良好的实时性和优化效果。
129 3
|
7月前
|
存储 监控 算法
内网监控桌面与 PHP 哈希算法:从数据追踪到行为审计的技术解析
本文探讨了内网监控桌面系统的技术需求与数据结构选型,重点分析了哈希算法在企业内网安全管理中的应用。通过PHP语言实现的SHA-256算法,可有效支持软件准入控制、数据传输审计及操作日志存证等功能。文章还介绍了性能优化策略(如分块哈希计算和并行处理)与安全增强措施(如盐值强化和动态更新),并展望了哈希算法在图像处理、网络流量分析等领域的扩展应用。最终强调了构建完整内网安全闭环的重要性,为企业数字资产保护提供技术支撑。
213 2
|
9月前
|
机器学习/深度学习 数据可视化 PyTorch
深入解析图神经网络注意力机制:数学原理与可视化实现
本文深入解析了图神经网络(GNNs)中自注意力机制的内部运作原理,通过可视化和数学推导揭示其工作机制。文章采用“位置-转移图”概念框架,并使用NumPy实现代码示例,逐步拆解自注意力层的计算过程。文中详细展示了从节点特征矩阵、邻接矩阵到生成注意力权重的具体步骤,并通过四个类(GAL1至GAL4)模拟了整个计算流程。最终,结合实际PyTorch Geometric库中的代码,对比分析了核心逻辑,为理解GNN自注意力机制提供了清晰的学习路径。
645 7
深入解析图神经网络注意力机制:数学原理与可视化实现
|
9月前
|
机器学习/深度学习 缓存 自然语言处理
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
Tiktokenizer 是一款现代分词工具,旨在高效、智能地将文本转换为机器可处理的离散单元(token)。它不仅超越了传统的空格分割和正则表达式匹配方法,还结合了上下文感知能力,适应复杂语言结构。Tiktokenizer 的核心特性包括自适应 token 分割、高效编码能力和出色的可扩展性,使其适用于从聊天机器人到大规模文本分析等多种应用场景。通过模块化设计,Tiktokenizer 确保了代码的可重用性和维护性,并在分词精度、处理效率和灵活性方面表现出色。此外,它支持多语言处理、表情符号识别和领域特定文本处理,能够应对各种复杂的文本输入需求。
1134 6
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
|
10月前
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
662 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
9月前
|
传感器 人工智能 监控
反向寻车系统怎么做?基本原理与系统组成解析
本文通过反向寻车系统的核心组成部分与技术分析,阐述反向寻车系统的工作原理,适用于适用于商场停车场、医院停车场及火车站停车场等。如需获取智慧停车场反向寻车技术方案前往文章最下方获取,如有项目合作及技术交流欢迎私信作者。
674 2
|
9月前
|
存储 监控 算法
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
168 7
|
10月前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
1220 12

推荐镜像

更多
  • DNS