我们正在考虑将我们的 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/