1. 程式人生 > >redis使用基礎(十) ——Redis存儲Session

redis使用基礎(十) ——Redis存儲Session

art 方式 pda 公眾 pub 存儲位置 center eight cal

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