php - redis中的php存储会话
问题描述
我想使用 Redis 在 PHP 中存储/检索会话,所以我创建了一个新的处理程序,如下所示:
class RedisSessionHandler implements SessionHandlerInterface
{
public $ttl = 1800; // 30 minutes default
protected $db;
protected $prefix;
public function __construct(PredisClient $db, $prefix = 'PHPSESSID:') {
$this->db = $db;
$this->prefix = $prefix;
}
public function open($savePath, $sessionName) {
// No action necessary because connection is injected
// in constructor and arguments are not applicable.
}
public function close() {
$this->db = null;
unset($this->db);
}
public function read($id) {
$id = $this->prefix . $id;
$sessData = $this->db->get($id);
$this->db->expire($id, $this->ttl);
return $sessData;
}
public function write($id, $data) {
$id = $this->prefix . $id;
$this->db->set($id, $data);
$this->db->expire($id, $this->ttl);
}
public function destroy($id) {
$this->db->del($this->prefix . $id);
}
public function gc($maxLifetime) {
// no action necessary because using EXPIRE
}
}
我将它设置为处理程序
$db = new PredisClient();
$sessHandler = new RedisSessionHandler($db);
session_set_save_handler($sessHandler);
session_start();
在一个真实的应用程序中,我正在使用 DI,并且我有一个SessionMiddleware
设置和启动会话的位置
我收到如下错误:Warning: session_start(): Failed to read session data: user (path: )
这是否意味着我仍然需要设置session.save_path = tcp://127.0.0.1:6379
ini 文件?对我来说,当我将 Redis 实例传递给自定义处理程序时,这没有任何意义
解决方案
read
我找到了解决方案,您需要在 PHP 7.2 和更新的方法中返回空字符串https://www.php.net/manual/en/function.session-start.php#120589
推荐阅读
- c++ - 我的预增量工作正常,但不是后增量
- jboss - JBPM 7:如何获取登录用户信息
- elasticsearch - 如何从 kibana 中仅提取“消息”字段值?
- c# - 如何使用命名管道在 C# 和 MQL5 之间读取和写入消息
- babeljs - babel/polyfill 添加全局变量 core
- python - 创建一个删除列表中奇数倍数的函数
- php - 如何使用 Laravel 5.8 导入 .dat 文件并读取数据内容
- python - Seaborn catplot 通过改变色调导致错误
- comments - 使用 instaPy 评论帖子时出现问题
- system-verilog - uvm_sqr_if_base::peek() 和 uvm_sqr_if_base::get_next_item() 有什么区别?