php實(shí)現(xiàn)Session存儲(chǔ)到Redis
介紹了php實(shí)現(xiàn)Session存儲(chǔ)到Redis的方法,php Session可以保存到文本或者內(nèi)存、還有數(shù)據(jù)庫,本文講的是存到Redis的方法.
對(duì)于大訪問量的站點(diǎn)使用默認(rèn)的Session 并不合適,我們可以將其存入數(shù)據(jù)庫、或者使用Redis KEY-VALUE數(shù)據(jù)存儲(chǔ)方案
首先新建一個(gè)session表
CREATE TABLE `sessions` (
`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引擎采用內(nèi)存表,所有數(shù)據(jù)存儲(chǔ)在內(nèi)存,操作速度快
<?php
/pic/p>
include "db.php";
class MySessionHandler implements SessionHandlerInterface
{
private $savePath;
private $sessData;
public $expiretime; /pic/p>
public $db; /pic/p>
public function __construct($hanlder =''){
$this->db = Database::getInstance();
/pic/p>
/pic/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;
}
}
/pic/p>
/pic/p>
public function write($id, $data)
{
/pic/p>
/pic/p>
$now = time();
$newExp = $now+$this->expiretime; /pic/p>
$sql = "select * from sessions where sid ='$id'";
$result = $this->db->getOne($sql);
/pic/p>
if($data==''||isset($data)){
$data = $this->sessData;
}
if($result){
/pic/p>
$sql ="update sessions set updatetime = '$newExp',data ='$data' where sid = '$id'";
/pic/p>
$update_data =$this->db->execute($sql);
if($update_data){
return true;
}
}else{
/pic/p>
$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)
{ /pic/p>
$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($this->tosql);
if($data){
return true;
}else{
return false;
}
return true;
}
}
實(shí)例化
此處 PHP 手冊(cè)可以有兩種方法
1,實(shí)現(xiàn)了SessionHandlerInterface借口的對(duì)象,自PHP5.4可以使用
2 ,直接使用 session_set_save_handler
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/pic/p>
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();
}
$_SESSION['QQ']="QQ";
echo $_SESSION['QQ'];
數(shù)據(jù)庫代碼
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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=localhost;dbname=session', 'root','');
}
public function getOne($sql){
$rs =self::$db->query($sql);
@$rs->setFetchMode(PDO::FETCH_ASSOC);/pic/p>
$result = $rs -> fetch();
return $result;
}
public function execute($sql){
$rs = self::$db->exec($sql);
return $rs;
}
}
/pic/p>
/pic/p>
使用REDIS 存儲(chǔ)SESSION
<?php
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); /pic/p>
$retval = 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);
/pic/p>
return true;
}
return false;
}
public function destory($id){
if($this->redis->delete($id)){
return true;
}
return false;
}
public function gc($maxlifetime){
return true;
}
/pic/p>
public function __destruct(){
session_write_close();
}
}
$re = new SessionManager();
$_SESSION['name'] = "qq";
echo $_SESSION['name'];
以上就是詳細(xì)的介紹了php實(shí)現(xiàn)Session存儲(chǔ)到Redis的方法,希望對(duì)大家的學(xué)習(xí)有所幫助。
【php實(shí)現(xiàn)Session存儲(chǔ)到Redis】相關(guān)文章:
php中Session存儲(chǔ)到Redis的方法11-16
PHP用Redis替代文件存儲(chǔ)Session的方法01-25
關(guān)于PHP中session 存儲(chǔ)方式的詳細(xì)介紹01-06
PHP中使用session實(shí)現(xiàn)保存用戶登錄信息12-14
PHP實(shí)現(xiàn)多服務(wù)器共享SESSION 數(shù)據(jù)09-27
Session在PHP中的使用11-15
用PHP基于Redis消息隊(duì)列實(shí)現(xiàn)發(fā)布微博的方法03-05
Javascript到PHP加密通訊的簡(jiǎn)單實(shí)現(xiàn)03-15
教你如何使用php的session01-19