首页 > PHP教程 > php开发知识文章

PHP 使用redis实现Session功能的方法

对于大访问量的站点使用php系统默认的Session 速度不够快,优化方法为将其存入数据库、或者使用Redis KEY-VALUE数据存储方案

首先新建一个ownsession表

CREATE TABLE `ownsession` (
`sid` CHAR(40) NOT NULL,
`updatetime` INT(20) NOT NULL,
`data` VARCHAR(200) NOT NULL,
UNIQUE KEY `sid` (`sid`) USING HASH
)
ENGINE = MEMORY
DEFAULT CHARSET = utf8;

Mysql 的memory引擎采用内存表,所有数据存储在内存,操作速度快

数据库操作文件 db.php

//数据库代码 db.php

class Database
{
static $instance;
static $db;

static function getInstance()
{
if (self::$instance) {
return self::$instance;
} else {
return new Database();
}
}

public function __construct()
{
self::$db = new PDO('mysql:host=127.0..1;dbname=session', 'root', '');
}

public function getOne($sql)
{
$rs = self::$db->query($sql);
@$rs->setFetchMode(PDO::FETCH_ASSOC);//返回关联数组
$result = $rs->fetch();
return $result;
}

public function execute($sql)
{
$rs = self::$db->exec($sql);
return $rs;
}
}

$data = Database::getInstance();

自定义session操作

//引入数据库文件
include "db.php";

class MySessionHandler implements SessionHandlerInterface
{
private $savePath;
private $sessData;
public $expiretime; //设置过期时间
public $db; //数据库

public function __construct($hanlder = '')
{
$this->db = Database::getInstance(); //获取数据库实力
//var_dump($this->db);
}

public function open($savePath, $sessionName)
{
return true;
}

public function close()
{
return true;
}

public function read($id)
{
$sql = "select * from sessions where sid ='$id'";
$result = $this->db->execute($sql);
if (!empty($result)) {
return $this->sessData = $result;
}
}

/**
* @param String $id 当前会话ID
* @param String $data 序列化之后的字符串
* @return Boolean
*/
public function write($id, $data)
{
// echo $id; // echo $data;
$now = time();
$newExp = $now + $this->expiretime; //总时间=当前时间 + 期限时间
$sql = "select * from sessions where sid ='$id'";
$result = $this->db->getOne($sql); //var_dump($result);
if ($data == '' || isset($data)) {
$data = $this->sessData;
}
if ($result) {
//如果存在则更新
$sql = "update sessions set updatetime = '$newExp',data ='$data' where sid = '$id'";
//echo $sql;
$update_data = $this->db->execute($sql);
if ($update_data) {
return true;
}
} else {
//不存在则生成生成
$sql = "insert into sessions(sid,updatetime,data) values('$id','$now','$data')";
$insert_data = $this->db->execute($sql);
if ($insert_data) {
return true;
}
}
return false;
}

public function destroy($id)
{
//销毁
$sql = "delete from sessions where sid=" . "$id";
$destory = $this->db->execute($sql);
if ($destory) {
return true;
} else {
return false;
}
}

public function gc($sessMaxLifeTime)
{
$t = time();
$sql = "delete from sessions where $t - 'updatetime'>${sessMaxLifeTime}";
$data = $this->db->execute($sql);
if ($data) {
return true;
} else {
return false;
}
return true;
}
}

实例化

此处 PHP 手册可以有两种方法

    1,实现了SessionHandlerInterface借口的对象,自PHP5.4可以使用

    2 ,直接使用  session_set_save_handler

//判断PHP版本
if (version_compare(PHP_VERSION, 5.4) == 1) {
session_set_save_handler($handler, true);
session_start();
} else {
ini_set('session.use_trans_sid', 0);
ini_set('session.use_cookies', 1);
ini_set('session.cookie_path', '/');
ini_set('session.save_handler', 'user');
session_module_name('user');
session_set_save_handler(
array($session, "open"),
array($session, "close"),
array($session, "read"),
array($session, "write"),
array($session, "destory"),
array($session, "gc")
);
session_start();
}

使用REDIS 存储SESSION

class SessionManager
{
private $redis;
private $sessionSavePath;
private $sessionName;
private $sessionExpireTime = 30;

public function __construct()
{
$this->redis = new Redis();
$this->redis->connect('127.0.0.1', 6379); //连接redis
session_set_save_handler(
array($this, "open"),
array($this, "close"),
array($this, "read"),
array($this, "write"),
array($this, "destory"),
array($this, "gc")
);
session_start();
}

public function open($path, $name)
{
return true;
}

public function close()
{
return true;
}

public function read($id)
{
$value = $this->redis->get($id);
if ($value) {
return $value;
} else {
return "";
}
}

public function write($id, $data)
{
if ($this->redis->set($id, $data)) {
$this->redis->expire($id, $this->sessionExpireTime); //设置过期时间
return true;
}
return false;
}

public function destory($id)
{
if ($this->redis->delete($id)) {
return true;
}
return false;
}

public function gc($maxlifetime)
{
return true;
}

//析构函数
public function __destruct()
{
session_write_close();
}
}

$re = new SessionManager();
$_SESSION['name'] = "aa";
echo $_SESSION['name'];

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。