php - 将 php session 移动到 redis。有可能不丢失现有 session 数据吗?

标签 php apache redis

我们正在考虑将我们的 php session 数据移动到 redis。

设置看起来很简单。只需在 php.ini 中设置以下内容并重新启动 apache。它应该全部设置好。:

session.save_handler = redis
session.save_path = "tcp://host1:6379"

如果可能的话,我希望我们的用户不要注意到迁移。是否可以在不丢失任何现有 session 数据的情况下将 session 数据移动到 Redis?

最佳答案

目前没有现成可用的解决方案来满足您的要求,但为此任务编写自定义脚本实际上相当简单。

本质上,phpredis将session数据以字符串形式存储在redis中,键名格式如下:PHPREDIS_SESSION:$sessionid,其中$sessionid是session的php id,可通过 session_id() 检索的那个。 session 数据被“编码”为 php-session 序列化变量(与常见的 php 序列化/反序列化格式略有不同,请参阅 session_encode )。

既然我们知道了这一点,那么迁移存储在文件中的 session 数据有两种可能性:

  • 遍历每个 session 文件(实际路径设置在您的 php.ini 中的 session.save_path),读取数据并将其写回 redis。文件本身存储 session 数据的 php-session 序列化表示,这意味着内容可以直接复制到 redis,文件名具有以下模式:sess_$sessionid,其中 $您猜对了,sessionid 是您要用于您的 redis key 的 ID。

  • 通过暂时使用基于文件的 session 逐步迁移数据,但在使用 session 数据时实时填充 redis,直到存储在 redis 中的 session 数量看起来足以进行切换。这可以通过执行以下操作来实现:

    $redis->set("PHPREDIS_SESSION:".session_id(), session_encode());

    就在每个脚本结束之前。此方法可能会增加一点开销 取决于 session 中的数据量以及 session_encode 的方式 有效。

关于php - 将 php session 移动到 redis。有可能不丢失现有 session 数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12651464/

相关文章:

lua - 如何解析redis lua脚本中的Javascript对象

amazon-web-services - 如何使 AWS 上的 redis 实例可以从 VPC 外部访问

php - 每次创建项目都要下载Laravel?

apache - 如何在不使用 URL 重定向的情况下将向 Apache 服务器发出的请求传输到 IIS 服务器?

java - 即使使用 apache poi 的代码相同,Excel 单元格在不同的机器上也会缩小

node.js - 如何使用nestjs redis微服务?

php - 如何使用 Axios 使用经过身份验证的 API

php - 运行 composer update 后出现错误 Peer fingerprint did not match

javascript - 在 highchart 系列的点击事件中使用带有参数的 symfony 路由

python - Apache:标题之前的脚本输出结束