1. 程式人生 > >一些php中session的理解

一些php中session的理解

寫在最前面:
感謝這位博主的分享::詩小藍–《徹底理解PHP的SESSION機制》

你知道這幾個問題嗎?
1. session會話是怎麼控制多個使用者的?(或者這樣問:session是儲存在伺服器上的檔案,怎麼保證使用者資訊不衝突?)
2. 為什麼瀏覽器關閉了再開啟session就不起作用了?

php中session的歷程…….

引用自php手冊:

session_start() 會建立新會話或者重用現有會話。 如果通過 GET 或者 POST 方式,或者使用 cookie 提交了會話 ID, 則會重用現有會話。
當會話自動開始或者通過 session_start() 手動開始的時候, PHP 內部會呼叫會話管理器的 open 和 read 回撥函式。 會話管理器可能是 PHP 預設的, 也可能是擴充套件提供的(SQLite 或者 Memcached 擴充套件), 也可能是通過 session_set_save_handler() 設定的使用者自定義會話管理器。 通過 read 回撥函式返回的現有會話資料(使用特殊的序列化格式儲存), PHP 會自動反序列化資料並且填充 $_SESSION 超級全域性變數。

手冊中說到的一個詞語是“會話ID”,通過這個“會話ID”就可以解釋問題1了;無論是重用還是建立會話ID,session都會往客戶端存放一個會話ID(以cookie的方式儲存),這樣就能區別不同的客戶端了,就能保證使用者資訊不衝突了:
示例:

<?php
session_start();
if(!isset($_SESSION['login'])){
    echo '沒有登入';
    $_SESSION['login'] = [
      'id'=>2,
      'name'=>'newUser',
      'age'=>'22'
    ];
}else
{ var_dump($_SESSION['login']); }

當第一次訪問的時候以上程式碼時我們來看看整個請求過程:
第一次訪問

從程式碼順序來看,session_start(),php SESSION 產生了一個名字叫做“PHPSESSID”的會話ID,產生後進入if,往這次會話裡面新增資料$_SESSION[‘login’],此時的響應頭,已經給客戶端設定了會話ID了,注意紅色方框裡面設定的會話ID值,此時是“n1vl465rpj0hi35177jiap2ud2”;
第二次訪問:
第二次訪問
第二次訪問就是重用現有會話了,可以看到請求頭已經將剛剛儲存的會話ID請求過去了,會話ID就是剛剛建立的:‘n1vl465rpj0hi35177jiap2ud2’;

結論:

回答問題1:每一次會話都會產生唯一的會話ID,這個會話ID會對應不同的session檔案,因此session儲存的使用者資訊是不會衝突的
那麼為什麼關閉瀏覽器session就失效了呢?
回答問題2:SESSION發出去的COOKIE一般屬於即時COOKIE(手冊是這樣描述的:session.cookie_lifetime 以秒數指定了傳送到瀏覽器的 cookie 的生命週期。值為 0 表示“直到關閉瀏覽器”。預設為 0。),當瀏覽器關閉後,COOKIE就過期了,重新進入時又只能重新設定PHPSESSID了