php 嚴格控制session的過時時間

    工做過一段時間,相信你們必定也碰到過一個問題: php

        1.前臺用戶不知道怎麼的就自動掉線了.服務器

        2.後臺退出登錄以後全部的前臺用戶也都掉線了.session

        3.我想控制個人用戶半個小時自動下線,發現改了配置文件也很差使.ide


    上述的全部問題都是我近期碰到的,後來經過查詢知道:php的session機制由幾個參數同時控制,具體是哪些我就不具體寫了,分別是一個機率,一個最大過時時間,還有一個session的存儲路徑.在php.ini中咱們能夠看到,php的session的默認過時時間位24分鐘,也就是說若是咱們24分鐘沒有操做頁面,這個session就過時了,固然這是理想狀態下.24分鐘以後php會出發一個session的回收機制,這個機制用來檢測默認存儲目錄下的session文件的更改時間是否爲24分鐘以前,若是是那麼刪除session.固然這也是理想狀態下.這就是前面提到的一個機率了,session的回收機制是按機率觸發的,也就是說,即便你的session爲24分鐘以前的文件,若是步觸發回收機制你的session依然沒有過時.這固然也不是咱們想要的了.爲了解決這個問題就出現了我前面提到的第三個參數,也就是session的存儲路徑,若是你沒有開啓php.ini內部的session.save_path那麼session是不會有文件產生的,因此爲了能更加有效的控制session咱們將其打開而且填寫一個路徑,或者在文件中用session_save_path(".....")函數來定義這個session的存儲的路徑.還有一點很重要,那就是成若是session存儲在咱們本身定義的路徑內部,seesion的回收機制是不起做用的.因此只能咱們本身來控制session的過時時間了.
函數

    下面是一個我本身根據理解寫的一個關於session的過時處理類
測試

        

<?php this

class Session{spa

private $savePath;//存儲session的路徑,必須是絕對路徑設計

private $time;//存儲session的過時時間,單位是秒it

private $sessionName;//session的名字

private $sessionValue;//session的值


public function __construct($savePath)

{

//將session存入指定的目錄

$this->savePath = $savePath;

            //注意:這個必定要寫在session_start前面

session_save_path($this->savePath); 


session_start();//開啓session

if(!is_dir($this->savePath))

{

                //默認爲最大的權限 0777

mkdir($this->savePath) or die('系統錯誤!');

}

}


//建立session  一共三個參數,

               // $name->session名字 

               // $val->session值 

               // $time->過時時間,默認爲30分鐘

public function setSession($name,$val,$time=1800)

{

$this->sessionName  = $name;

$this->sessionValue  = $val;

$this->time       = $time;

if(!isset($_SESSION[$this->sessionName]))

{

if(is_array($this->sessionValue))

{

foreach($this->sessionValue as $key=>$val)

{

$_SESSION[$this->sessionName][$key] = $val;

}

}

else

{

$_SESSION[$this->sessionName]['val']   = $this->sessionValue;

}

$_SESSION[$this->sessionName]["startTime"] = time();

}

//這時候說明session已經存在,那麼咱們判斷他是否過時,若是過時,刪除session

else if(isset($_SESSION[$this->sessionName]["startTime"]) && time()-$_SESSION[$this->sessionName]['startTime']>=$this->time)

{

unset($_SESSION[$this->sessionName]);

}

}

}

 ?>


    經過這個類咱們能夠達到幾個目的:

                    1.咱們能夠明確的控制session的過時時間.

                    2.對應上面的第二個問題,我以前作用戶退出登錄的時候一般這樣寫 session_destroy();或者寫成unset($_SESSION);卻不知這樣就把全部的session都清除了,因此咱們會遇到前面一個用戶退出以後,咱們本身的session也被刪除了.

                    3.用戶不會平白無故的掉線了,由於對咱們來講每一個步驟如今都是透明的了.


    固然我也有一些疑問:

        1.爲何php會這樣設計session機制呢?

        2.服務器到底有沒有給咱們留下建立文件的權限呢?這個類只是一個小小的測試,至於實際工做中會遇見什麼樣的問題,咱們敬請期待.

相關文章
相關標籤/搜索