1. 程式人生 > >PHP-會話控制-Session

PHP-會話控制-Session

art src iso 代碼 cookie ray test 會話控制 建立

1.什麽是Session

  上一節我們討論到將數據以cookie的形式保存在客戶端有很多弊端。為了解決這些問題就有了Session。

  Session是以文件的形式保存在服務器端的數據。

  服務器通過向客戶端發送一個Cookie保存sessionid的方式,將session與客戶端建立一對一的聯系。

  瀏覽器:Cookie(sessionid)<------一一對應------>(sessionid)Session:服務器

2.開啟一個會話

  session_start();
  /*開啟一個會話主要做一下兩件事*/
  /*1如果客戶端有以cookie保存的sessionid,那麽就將對應的session數據取到內存中
*/ /*2如果沒有,發送一個新的sessionid以cookie的形式交給客戶端保存*/

  註:如果是基於Cookie的Session因為Cookie是在http頭中傳遞的,所以session_star()和setcookie()一樣在這之前不能有任何輸出。

  如圖,運行一遍session_start()之後在瀏覽器找到了一個名為PHPSESSID的Cookie

  技術分享圖片

  我們使用下面代碼打印出客戶端的sessionid

  session_start();
   echo session_id();//ldlq3n79jhkbdt120iacq19vs6

  兩者的id是一致的。如果在不關閉瀏覽器的前提下(因為默認的是瀏覽器關閉時刪除PHPSESSID),打開一個新的網頁仍然會打印出一樣的sessionid。

  如果想要更改保存sessionid的cookie保存的時間可以在配置文件中修改session.cookie_lifetime選項(以秒為單位),默認是0,表示瀏覽器關閉時刪除。

3.Session存取數據

  PHP使用一個全局數組$_SESSION存取數據,使用起來就和普通數組一樣。

  值得一提的是,內存中的數據在腳本執行完畢後就會全部銷毀,所以session中的數據實際上都是要以文件的形式存到硬盤中的。而開啟會話時又會把保存的數據讀到內存中方便使用。

  這些操作都是有PHP自動處理的。

  

  如下,創建一個session數據

  session_start();
    echo
session_id(); $_SESSION[‘test‘]="this is a session";

  當代碼執行完畢後會創建一個文件保存這個數據,文件名為session的sessionid。

  這個目錄是通過配置文件中的session.save_path配置的,一般是‘./tmp‘。

  我的目錄是"E:xampp/tmp",打開目錄找到文件

    技術分享圖片

  打開文件看一下

  技術分享圖片

  這正是之前保存的值。

4.結束一個Session

/*第一步,開啟會話,如果不開啟會話PHP獲得sessionid的話PHP怎麽知道刪除那個session呢*/
    session_start();

    /*第二步,session中的數據已經被讀到內存中了,所以要清空它*/
    /*註意不能用unset($_SESSION),因為我們只是想清空數據,而不是刪除這個全局數組*/
    $_SESSION=array();

    /*第三步,刪除客戶端的cookie*/
    /*註:默認的cookie名為PHPSESSID但是這個名字是可以在配置文件中通過session.name更改的*/
       /*所以比起使用PHPSESSID還是用session_name()函數獲得cookie名穩妥一些*/
    if(isset($_COOKIE[session_name()]))
    {
        setcookie(session_name(),‘‘,time()-1,‘/‘);
    }

    /*第四步,刪除服務器端的文件*/
    session_destroy();

  

5.垃圾清理機制

  假如瀏覽器端的cookie生命周期到了被刪除以後,那麽我們就沒有辦法用上面的方法刪除保存在硬盤中的session文件了。客戶端下次訪問是會被分配到一個新的Sessionid,原來的文件也用不到了。

  那麽這些垃圾文件怎麽刪除呢。

  PHP有垃圾清理機制。

  在配置文件中有三個重要選項

  session.gc_maxlifetime= 指定一個時間,以秒為單位,當垃圾清理機制啟動是如果session文件的修改時間大於這個屬性設置的值的話,垃圾清理機制就會刪除這個文件,反之不然。

  session.gc_probability和session.gc_divisor,設S=session.gc_probability/session.gc_divisor,那麽每次session_start()時有S的幾率啟動垃圾清理機制。

  S的值過大過小都不好,一般session.gc_probability=1,而session.gc_divisor=(1000~5000)。

PHP-會話控制-Session