PHP 使用redis实现Session功能的方法
2017-05-16 22:56:55
•
阅读
打赏
对于大访问量的站点使用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'];
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
相关推荐
深度学习 -- 损失函数
深度残差网络(Deep Residual Networks (ResNets))
深度学习 -- 激活函数
神经网络训练 -- 调整学习速率
生成对抗网络(GAN)改进与发展
生成对抗网络(GAN)优点与缺点
生成对抗网络(GAN)的训练
生成对抗网络(GAN)基本原理
生成模型与判别模型