我想使用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示例传递给自定义处理程序是没有意义的
1条答案
按热度按时间efzxgjgh1#
我找到了解决方法,你需要在
read
PHP7.2及更新版本中的方法https://www.php.net/manual/en/function.session-start.php#120589