redis中的php存储会话

ny6fqffe  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(399)

我想使用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示例传递给自定义处理程序是没有意义的

efzxgjgh

efzxgjgh1#

我找到了解决方法,你需要在 read PHP7.2及更新版本中的方法https://www.php.net/manual/en/function.session-start.php#120589

相关问题