redis使用基礎(十) ——Redis存儲Session
redis使用基礎(十)
——Redis存儲Session
(轉載請附上本文鏈接——linhxx)
一、概述
PHP默認是將session存於服務器的文件中。當並發量大,此方式效率低,因此可以采用redis存儲session。
要改變session的存儲位置,首先要改變php.ini中的配置項session.save_handler,將其值設置為user。
二、改變存儲位置函數
php內置的函數session_set_save_handler可以重新設定session的保存方式,包括session的打開、關閉、寫入、讀取等。
session_set_save_handler方法實質上不僅實現存儲位置由文件變為redis(或其他用戶定義的存儲類型如memcache),還需要自定義session被打開、關閉、設置、讀取、銷毀、回收等情況下,php具體去執行的內容。因此,該方法傳入的變量全是回掉函數。
該方法的具體內容,在php官方文檔中,定義如下:
bool session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid [, callable $validate_sid [, callable $update_timestamp ]]] )
具體定義如下:
1、open
當session被打開時,會自動調用此函數。類似於類的構造函數。
2、close
當session關閉時調用的函數,類似於析構函數。
3、read
如果會話中有數據,read 回調函數必須返回將會話數據編碼(序列化)後的字符串。 如果會話中沒有數據,read 回調函數返回空字符串。
其中,存儲在session的內容如果是數組、對象,必須序列化後存儲,而session調用此函數後會自動將值進行反序列化。
4、write
當要保存session數據時,當前會話 ID 以及 $_SESSION 中數據序列化之後的字符串作為參數。序列化後的數據將和會話 ID 關聯在一起進行保存。 當調用 read 回調函數獲取數據時,所返回的數據必須要和 傳入 write 回調函數的數據完全保持一致。
5、destroy
調用session_destroy時會調用此函數。
6、gc
會話回收清理舊數據時調用的內容。
7、create_id
當需要重新生成新的會話id時調用的函數。
三、PHP實現session存儲於redis
<?php
//類的功能——實現將session存儲在redis
class SessionSaveRedis{
private $redis;
private $sessionPath;
private $sessionName;
private $sessionExpireTime = 100;
//構造函數,連接redis
public function __construct(){
$this->redis = new Redis();
$this->redis->connect(‘127.0.0.1‘, 6379);
$this->loadSession();
session_start();
}
//加載自定義session方法
public function loadSession(){
session_set_save_handler(
array($this, ‘open‘),
array($this, ‘close‘),
array($this, ‘read‘),
array($this, ‘write‘),
array($this, ‘destroy‘),
array($this, ‘gc‘)
);
}
public function open($path, $name){
return true;
}
public function close(){
return true;
}
//存入redis時,key采用session:id,
//便於統一管理所有的session,與redis中存儲的其他內容作為區分
public function read($id){
$value = $this->redis->get(‘session:‘ . $id);
if($value){
return $value;
}else{
return ‘‘;
}
}
public function write($id, $data){
if($this->redis->set(‘session:‘ . $id, $data)){
$this->redis->expire(‘session:‘ . $id, $this->sessionExpireTime);
return true;
}
return false;
}
public function gc($time){
return true;
}
public function __destruct(){
session_write_close();
}
}
四、使用方式
假設讀、寫session和定義SessionSaveRedis類分別在三個php文件中,方法如下:
1、寫session
include(‘SessionSaveRedis.php‘);
new SessionSaveRedis();
$_SESSION[‘test‘] = ‘a‘;
2、讀session
include(‘SessionSaveRedis.php‘);
new SessionSaveRedis();
$_SESSION[‘test‘];
——written by linhxx
更多最新文章,歡迎關註微信公眾號“決勝機器學習”,或掃描右邊二維碼。
redis使用基礎(十) ——Redis存儲Session