php session基本原理解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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);
目录
相关文章
|
3天前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
31 13
|
22天前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
56 1
|
17天前
|
运维 数据库连接 PHP
PHP中的异常处理机制深度解析####
本文深入探讨了PHP中异常处理机制的工作原理,通过实例分析展示了如何有效地使用try-catch语句来捕获和处理运行时错误。我们将从基础概念出发,逐步深入到高级应用技巧,旨在帮助开发者更好地理解和利用这一强大的工具,以提高代码的稳定性和可维护性。 ####
|
17天前
|
PHP 开发者 UED
PHP中的异常处理机制解析####
本文深入探讨了PHP中的异常处理机制,通过实例解析try-catch语句的用法,并对比传统错误处理方式,揭示其在提升代码健壮性与可维护性方面的优势。文章还简要介绍了自定义异常类的创建及其应用场景,为开发者提供实用的技术参考。 ####
|
15天前
|
PHP 开发者 容器
PHP命名空间深度解析及其最佳实践####
本文深入探讨了PHP中引入命名空间的重要性与实用性,通过实例讲解了如何定义、使用及别名化命名空间,旨在帮助开发者有效避免代码冲突,提升项目的模块化与可维护性。同时,文章还涉及了PHP-FIG标准,引导读者遵循最佳实践,优化代码结构,促进团队协作效率。 ####
24 1
|
18天前
|
PHP 开发者 容器
PHP命名空间深度解析:避免命名冲突与提升代码组织####
本文深入探讨了PHP中命名空间的概念、用途及最佳实践,揭示其在解决全局命名冲突、提高代码可维护性方面的重要性。通过生动实例和详尽分析,本文将帮助开发者有效利用命名空间来优化大型项目结构,确保代码的清晰与高效。 ####
18 1
|
22天前
|
编译器 PHP 开发者
PHP 8新特性解析与实战应用####
随着PHP 8的发布,这一经典编程语言迎来了诸多令人瞩目的新特性和性能优化。本文将深入探讨PHP 8中的几个关键新功能,包括命名参数、JIT编译器、新的字符串处理函数以及错误处理改进等。通过实际代码示例,展示如何在现有项目中有效利用这些新特性来提升代码的可读性、维护性和执行效率。无论你是PHP新手还是经验丰富的开发者,本文都将为你提供实用的技术洞察和最佳实践指导。 ####
27 1
|
25天前
|
数据库连接 PHP 开发者
PHP中的异常处理机制深度解析####
本文深入探讨了PHP中异常处理的核心概念、使用场景及最佳实践,旨在帮助开发者更高效地管理和响应运行时错误。通过实例演示和理论分析,揭示try-catch块的运作原理,以及如何自定义异常类以增强代码的可读性和可维护性。文章还对比了传统错误处理方式与异常处理的优势,为读者提供了在复杂项目中实施健壮错误管理策略的指导。 ####
|
25天前
|
数据采集 JavaScript 网络安全
为什么PHP爬虫抓取失败?解析cURL常见错误原因
豆瓣电影评分是电影市场的重要参考,通过网络爬虫技术可以高效采集评分数据,帮助电影制作和发行方优化策略。本文介绍使用PHP cURL库和代理IP技术抓取豆瓣电影评分的方法,解决反爬机制、网络设置和数据解析等问题,提供详细代码示例和优化建议。
为什么PHP爬虫抓取失败?解析cURL常见错误原因
|
22天前
|
存储 供应链 算法
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
47 0

推荐镜像

更多
下一篇
DataWorks