session存入redis


Session信息入Redis

Session簡介

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

    然而當session一詞與網絡協議相關聯時,它又往往隱含了“面向連接”和/或“保持狀態”這樣兩個含義,“面向連接”指的是在通信雙方在通信之前要先 建立一個通信的渠道,比如打電話,直到對方接了電話通信才能開始,與此相對的是寫信,在你把信發出去的時候你並不能確認對方的地址是否正確,通信渠道不一 定能建立,但對發信人來說,通信已經開始了。“保持狀態”則是指通信的一方能夠把一系列的消息關聯起來,使得消息之間可以互相依賴,比如一個服務員能夠認 出再次光臨的老顧客並且記得上次這個顧客還欠店里一塊錢。這一類的例子有“一個TCP session”或者“一個POP3 session”③。 

    而到了web服務器蓬勃發展的時代,session在web開發語境下的語義又有了新的擴展,它的含義是指一類用來在客戶端與服務器之間保持狀態的解決方 案④。有時候session也用來指這種解決方案的存儲結構,如“把xxx保存在session里”⑤。由於各種用於web開發的語言在一定程度上都提供 了對這種解決方案的支持,所以在某種特定語言的語境下,session也被用來指代該語言的解決方案,比如經常把Java里提供的javax.servlet.http.HttpSession簡稱為session⑥。 

    鑒於這種混亂已不可改變,本文中session一詞的運用也會根據上下文有不同的含義,請大家注意分辨。 
在本文中,使用中文“瀏覽器會話期間”來表達含義①,使用“session機制”來表達含義④,使用“session”表達含義⑤,使用具體的“HttpSession”來表達含義⑥ 

為什么要把SESSION保存在緩存

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

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

第二就是當用到多台服務器的時候可能會出現,session丟失問題(其實是保存在了其他服務器上)。

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

SESSION保存在緩存中

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

如果想簡單操作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");

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

echo $_SESSION['view'];

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

 如果是memcache

 

<?php

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

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

session_start();

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

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

echo $_SESSION['view'];

 

也可以使用

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

用法如下自定義一個Redis_session類

<?php

class RedisSession{

    private $_redis = array(

        'handler' => null, //數據庫連接句柄

        '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(){

        //設置session處理函數

        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;

    }

    //關

    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'];

 

 

這樣就可以實現session數據如redis代碼執行過程中必須安裝redis才可以


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM