php會話控制[3]-SESSION

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/phpbook/article/details/53671494

1.基礎知識

session同cookie一樣,都可以延展會話控制,通過存儲用戶信息來跟蹤訪問動作,不同的是,cookie是把信息存儲在客戶端,session把信息存儲在服務器,只在客戶端存儲了sessionid(),來對接session信息。

2.基本流程

1.瀏覽器訪問服務器
2.服務器session_start(),初始化session,生成sessionid,在服務器中生成文件名中帶有sessionid的session文件,如果有數據要寫入session,賦值給數組$_SESSION(暫時寫入內存),頁面程序執行完畢後,將session信息寫入session文件
3.瀏覽器通過http協議獲取到seesionid,存儲到cookie
4.瀏覽器再次請求服務器,初始化session,根據請求頭中的sessionid,查詢到session文件,將session信息寫入到數組$_SESSION,程序對$_SESSION進行增刪改操作(內存中的操作),頁面程序執行完畢後,將$_SESSION信息寫入session文件,順延session的生命週期。
5.session消除,(1)session過期後會被php回收,(2)主動刪除(session_destroy,session_unset)

3.關鍵點解析

1.session_start()

1.官方解析

  1. bool session_start ([ array $options = [] ] )
session_start() 會創建新會話或者重用現有會話。 如果通過 GET 或者 POST 方式,或者使用 cookie 提交了會話 ID, 則會重用現有會話。
當會話自動開始或者通過 session_start() 手動開始的時候, PHP 內部會調用會話管理器的 open 和 read 回調函數。 會話管理器可能是 PHP 默認的, 也可能是擴展提供的(SQLite 或者 Memcached 擴展), 也可能是通過 session_set_save_handler() 設定的用戶自定義會話管理器。 通過 read 回調函數返回的現有會話數據(使用特殊的序列化格式存儲), PHP 會自動反序列化數據並且填充 $_SESSION 超級全局變量。
還未研究PHP底層實現,這段信息讀的懵懵懂懂,應該就是把session信息寫入到$_SESSION全局變量

2.個人理解

session_start(),初始化session,如果瀏覽器請求中並不包含sessionid,服務器會生成一個新的sessionid,聲明一個全局數組$_SERVER,sessionid會返回給瀏覽器,並存儲到cookie,提供給下次訪問時使用,同時開始一個session的生命週期,如果請求中包含sessionid,並查詢到了session文件,就讀取文件內容,寫入到$_SESSION,延長了session的生命週期。

2.全局數組$_SESSION

session_start(),初始化或是填充$_SESSION,以及後續的增刪改這個數組,都是發生在內存當中的,請求結束後,纔將$_SESSION內容寫入相應的session文件

3.session手動刪除

1.session_unset();
2.unset($_SESSION);
3.$_SESSION = array();
4.session_destroy();
5.幹掉$_COOKIE[‘PHPSESSID’]

4.sessionid的URL傳遞

在cookie關閉的情況下,可以考慮使用url傳遞sessionid,
會話開始之後,可以使用 SID 常量。 如果客戶端未提供會話 cookie,該常量的展開形式爲 session_name=session_id, 反之,該常量爲空字符串。因此,可以直接在 URL 中包含此常量的展開字符串而無需考慮會話 ID 的實際傳送方式。
備註:可以使用 htmlspecialchars() 來打印 SID 常量的展開字符串以避免 XSS 相關的攻擊。
案例
  1. <a href="index.php?<?php echo htmlspecialchars(SID); ?>">demo</a>






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章