我们正在考虑将php会话数据移至Redis。
设置看起来很简单。只需在php.ini中设置以下内容,然后重新启动apache。应该全部设置好了:
session.save_handler = redis
session.save_path = "tcp://host1:6379"
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我希望我们的用户不要注意到迁移。是否可以将会话数据移到Redis而不丢失任何现有会话数据?
现在没有针对您所要求的即用型解决方案,但是为该任务编写自定义脚本实际上可能非常简单。
本质上,phpredis将会话数据以字符串的形式存储在redis中,并具有以下键名格式:PHPREDIS_SESSION:$sessionid,其中$sessionid会话的php ID,可通过检索session_id()。会话数据被“编码”为php-session序列化变量(与常见的php serialize / unserialize格式略有不同,请参见session_encode)。
现在我们知道了,迁移文件中存储的会话数据有两种可能性:
遍历每个会话文件(实际路径session.save_path在php.ini中设置),读取数据并将其写回到redis。文件本身存储了会话数据的php-session序列化表示形式,这意味着可以直接将内容复制到redis,文件名具有以下模式:sess_$sessionid,其中$ sessionid是您猜到的id将要用于您的redis键。
通过暂时停留在基于文件的会话中逐步迁移数据,但是在使用会话数据时实时填充redis,直到存储在redis中的会话数量看起来足以进行切换为止。这可以通过执行以下操作来实现:
$redis->set("PHPREDIS_SESSION:".session_id(), session_encode());
在每个脚本结束之前。此方法可能会增加一点开销,具体取决于会话中的数据量以及session_encode的工作方式。
| 归档时间: |
|
| 查看次数: |
2853 次 |
| 最近记录: |