session 加入redis的實現(xiàn)代碼
來源:易賢網(wǎng) 閱讀:644 次 日期:2016-08-13 13:33:46
溫馨提示:易賢網(wǎng)小編為您整理了“session 加入redis的實現(xiàn)代碼”,方便廣大網(wǎng)友查閱!

本篇文章主要介紹了session 加入redis 的實例,對session 進(jìn)行了詳細(xì)介紹,并提供了代碼實例,需要的朋友可以參考下

Session信息入redis

Session簡介

session,中文經(jīng)常翻譯為會話,其本來的含義是 指有始有終的一系列動作/消息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之為一個session。有時候我們可以看到這樣的話“在 一個瀏覽器會話期間,...”,這里的會話一詞用的就是其本義,是指從一個瀏覽器窗口打開到關(guān)閉這個期間①。最混亂的是“用戶(客戶端)在一次會話期間”這樣一句話,它可能指用戶的一系列動作(般情況下是同某個具體目的相關(guān)的一系列動作,比如從登錄到選購商品到結(jié)賬登出這樣一個網(wǎng)上購物的過程,有時候也被稱為一個transaction),然而有時候也可能僅僅是指一次連接,也有可能是指含義①,其中的差別只能靠上下文來推斷②。 

在本文中,使用中文“瀏覽器會話期間”來表達(dá)含義①,使用“session機制”來表達(dá)含義④,使用“session”表達(dá)含義⑤,使用具體的“HttpSession”來表達(dá)含義⑥ 

為什么要把SESSION保存在緩存

就php來說,語言本身支持的session是以文件的方式保存到磁盤文件中,保存在指定的文件夾中,保存的路徑可以在配置文件中設(shè)置或者在程序中使用函數(shù)session_save_path()進(jìn)行設(shè)置,但是這么做有弊端,

第一就是保存到文件系統(tǒng)中,效率低,只要有用到session就會從好多個文件中查找指定的sessionid,效率很低。

第二就是當(dāng)用到多臺服務(wù)器的時候可能會出現(xiàn),session丟失問題(其實是保存在了其他服務(wù)器上)。

當(dāng)然了,保存在緩存中可以解決上面的問題,如果使用php本身的session函數(shù),可以使用 session_set_save_handler()函數(shù)很方便的對session的處理過程進(jìn)行重新控制。如果不用php的session系列函數(shù), 可以自己編寫個類似的session函數(shù),也是可以的,我現(xiàn)在做的這個項目就是這樣,會根據(jù)用戶的mid、登錄時間進(jìn)行求hash作為 sessionId,每次請求的時候都必須加上sessionId才算合法(第一次登錄的時候是不需要的,這個時候會創(chuàng)建sessionId,返回給客戶 端),這么做也很方便、簡潔高效的。當(dāng)然了,我這篇文章主要說的是在php自身的SESSION中”做做手腳”。

SESSION保存在緩存中

php將緩存保存到redis中,可以使用配置文件,對session的處理和保存做修改,當(dāng)然了,在程序中使用ini_set()函數(shù)去修改也可以,這個很方便測試,我這里就使用這種方式,當(dāng)然了,要是生產(chǎn)環(huán)境還是建議使用配置文件。

如果想簡單操作session入redis操作可以將一下代碼運行一下:

<?php 

ini_set("session.save_handler", "redis"); 

ini_set("session.save_path", "tcp://localhost:6379"); 

session_start(); 

header("Content-type:text/html;charset=utf-8"); 

if(isset($_SESSION['view'])){ 

  $_SESSION['view'] = $_SESSION['view'] + 1; 

}else{ 

  $_SESSION['view'] = 1; 

echo "【view】{$_SESSION['view']}"; 

//這里設(shè)置session.save_handler方式為redis,session.save_path為redis的地址和端口,設(shè)置之后刷新,再回頭查看redis,會發(fā)現(xiàn)redis中的生成了sessionId,sessionId和瀏覽器請求的是一樣的, 

//也可以使用 

Session_set_save_handler(‘open','close',' read',' write',' destory',' gc'); 

//用法如下自定義一個Redis_session類 

<?php 

class RedisSession{ 

  private $_redis = array( 

    'handler' => null, //數(shù)據(jù)庫連接句柄 

    'host' => null,  //redis端口號 

    'port' => null, 

  ); 

  public function __construct($array = array()){ 

    isset($array['host'])?$array['host']:"false"; 

    isset($array['port'])?$array['host']:"false"; 

    $this->_redis = array_merge($this->_redis, $array); 

  } 

  public function begin(){ 

    //設(shè)置session處理函數(shù) 

    session_set_save_handler( 

      array($this, 'open'), 

      array($this, 'close'), 

      array($this, 'read'), 

      array($this, 'write'), 

      array($this, 'destory'), 

      array($this, 'gc') 

    ); 

  } 

  public function open(){ 

    $redis = new Redis(); 

    $redis->connect($this->_redis['host'], $this->_redis['port']); 

    if(!$redis){ 

      return false; 

    } 

    $this->_redis['handler'] = $redis; 

    $this->gc(null); 

    return true; 

  } 

  //關(guān) 

  public function close(){ 

    return $this->_redis['handler']->close(); 

  } 

  //讀 

  public function read($session_id){ 

    return $this->_redis['handler']->get($session_id); 

  } 

  //寫 

  public function write($sessionId, $sessionData){ 

    return $this->_redis['handler']->set($sessionId, $sessionData); 

  } 

  public function destory($sessionId){ 

    return $this->_redis['handler']->delete($sessionId) >= 1 ? true : false; 

  } 

  public function gc(){ 

    //獲取所有sessionid,讓過期的釋放掉 

    $this->_redis['handler']->keys("*"); 

    return true; 

  } 

$ses = new RedisSession(array('host'=>'127.0.0.1','port'=>'6379')); 

$ses->begin(); 

session_start(); 

$_SESSION['name']='zhangsan'; 

echo $_SESSION['name']; 

這樣就可以實現(xiàn)session數(shù)據(jù)如redis代碼執(zhí)行過程中必須安裝redis才可以。

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機網(wǎng)站地址:session 加入redis的實現(xiàn)代碼
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)