PHP 替换原生 Session:使用 Memcached 存储实现方案

夏知夏
夏知夏
发布时间:2026-10-16| 2人浏览过
原创

在分布式系统中,基于本地文件的 PHP Session 会导致状态无法同步。本文将介绍如何通过自定义 Handler 机制,将 PHP Session 数据存储在 Memcached 内存数据库中,从而实现多节点共享会话信息。

核心原理

该方案模拟了 PHP 内部的 Session 生命周期,主要包含以下三个步骤:

  1. 初始化(Start):检查客户端是否存在 Cookie。若无,则生成 32 位 MD5 哈希作为 Session ID,写入 Cookie;若存在,则读取该 ID 并从 Memcached 拉取对应的数组数据。
  2. 使用中(Use):页面运行期间,开发者像操作普通数组一样修改 $_SESSION 变量。
  3. 保存(Save):利用 register_shutdown_function 注册关闭钩子。在脚本执行结束时,将当前的 $_SESSION 数据以 Session ID 为键写回 Memcached,并关闭连接。

配置与实现代码

首先创建一个独立的 Session 处理类或函数文件(例如 memcachedsession.php),用于封装逻辑。

<?php
// Memcached 服务器连接地址
$_MEMCACHEAUTH = array(
    'host' => 'localhost',
    'port' => 11211
);

/*
获取一些初始化设置值
*/
$_SESSION_NAME = ini_get("session.name"); // sessionid的名称
$_SESSION_TIME = ini_get("session.cookie_lifetime"); // sessionid这个cookie的最大保存时间
$_SESSION_EXPIRE = ini_get("session.gc_maxlifetime"); // session键值对在memcached里面的过期时间
$_SESSION_MEMKEY = ""; // sessionid值

/*
自定义的_session_start()方法,替换PHP的原生session_start()
*/
function _session_start()
{
    global $_SESSION_NAME, $_SESSION_TIME, $_SESSION_MEMKEY;
    global $_SESSION;
    global $_MEMCACHEAUTH, $_sessionmem;
    
    // 建立 Memcached 连接
    $_sessionmem = memcache_connect($_MEMCACHEAUTH['host'], $_MEMCACHEAUTH['port']);
    
    if ( empty($_COOKIE[$_SESSION_NAME]) ) {
        // 情况a: 没有SessionID,生成新的
        $_SESSION_MEMKEY = md5( uniqid() );
        setcookie($_SESSION_NAME, $_SESSION_MEMKEY , $_SESSION_TIME, "/");
        $_SESSION = array();
    } else {
        // 情况b: 有SessionID,从缓存获取
        $_SESSION_MEMKEY = $_COOKIE[$_SESSION_NAME];
        $_SESSION = memcache_get($_sessionmem, $_SESSION_MEMKEY );
        if ( $_SESSION === FALSE ) {
            $_SESSION = array();
        }
    }
    
    // 注册一个handler,这个函数会在页面执行完的时候执行
    register_shutdown_function("_session_save_handler");
}

/*
页面最后执行的方法,用于保存session值,以及关闭memcached连接
*/
function _session_save_handler()
{
    global $_sessionmem;
    global $_SESSION, $_SESSION_NAME, $_SESSION_EXPIRE, $_SESSION_MEMKEY;
    
    // 将数据写入Memcached
    memcache_set($_sessionmem, $_SESSION_MEMKEY, $_SESSION, 0, $_SESSION_EXPIRE);
    memcache_close($_sessionmem);
}
?>

使用方法

在任何需要启动 Session 的文件中,引入上述文件并调用自定义的 _session_start() 函数即可。

第1步:设置 Session 值

创建测试文件 session_set.php。

<?php
include_once "memcachedsession.php";
_session_start();
$_SESSION['a'] = time();
?>

第2步:获取 Session 值

创建测试文件 session_get.php。

<?php
include_once "memcachedsession.php";
_session_start();

function getsession()
{
    echo $_SESSION['a'];
}
getsession();
?>

Memcached 作为一种高性能的内存对象缓存系统,将其应用于 Session 存储可以显著提升并发能力并支持集群部署。以上就是 PHP 利用 Memcached 实现 Session 机制的详细内容,更多关于 PHP Session 分布式存储的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。