§12.PHP會話技術
來自專欄 PHP Cooking+
本文獻給本專欄的19位粉絲
1703年,英語里有了cookie一詞,它源於荷蘭語的koekje,意為「小蛋糕」
1994年,網景公司的程序員Lou Montulli提出了將cookie用於網路會話的想法
1. 會話及會話技術
1)為什麼需要會話技術?
HTTP協議是無狀態、無記憶的。多次請求之間,無任何聯繫,無法把請求的狀態保存下去,即同一用戶請求同一網站的不同頁面,伺服器無法識別是否是同一用戶發起的請求。用戶無法進行連續的業務邏輯。
2)會話技術
同一瀏覽器對伺服器的多次請求中,將數據持久化存儲的技術,以實現連續的業務邏輯
3)會話周期
從打開瀏覽器直至關閉瀏覽器為止,這個時間間隔為會話周期。會話周期結束可能導致某些數據失效。
4)分類
如果持久化數據保存在瀏覽器端為cookie技術
如果持久化數據保存在伺服器端為session技術
2. Cookie
1)原理
① 當第一次請求時,伺服器會在響應時給瀏覽器一個儲存信息的cookie
② 這個cookie會保存在瀏覽器中,當下次請求的時候會攜帶cookie
2)設置Cookie
setcookie($name,[$value=""][$expire=0][$path=""][$domain=""][$secure][$httponly])
· expire
過期時間戳,time()+有效時間
不寫則默認會話結束後過期,設為PHP_INT_MAX則是永久有效,手動設定失效為time()- 1
· path
Cookie有效的伺服器路徑,設置成 / 時,Cookie對整個域名有效。
如設成 /foo/,Cookie 僅對域名中 /foo/ 目錄及其子目錄有效。
默認值是設置 Cookie 時的當前目錄,但同級文件夾或父文件夾則獲取不到
· domain
Cookie的有效域名/子域名。
· secure
設置這個Cookie是否僅通過 HTTPS協議傳給客戶端
· httponly
設置TRUE,Cookie僅可通過 HTTP 協議訪問。即Cookie無法通過類似 JS的語言訪問,有效減少 XSS 攻擊的身份竊取行為
3)數據類型
只能是標量類型,如果是中文字元串,查看時會顯示為亂碼
4)讀取$_COOKIE
可以讀取,但無法修改,且只能獲取本網站的cookie,不同瀏覽器不共用cookie,各自獨立
5)修改
設置相同cookie名,用新值覆蓋舊值即可
6)刪除
Setcookie(『aaa』,『』)
3. Session
---為了實現業務邏輯的連續性,將部分信息持久化存儲在伺服器端,可以保證數據的安全性及各個腳本之間的共享。Session基於Cookie,Cookie基於瀏覽器,更換瀏覽器會造成 Session數據的重新創建
1)原理
① 瀏覽器想獲取伺服器的session,必須有一個身份認證信息
② 伺服器的session數據可以被多個腳本共享訪問
2)開啟
·在php配置文件中將session.auto_start=0改為1
·在需要開啟的頁面寫入seesion_start(),默認存儲目錄為c:/windows/temp
·在php配置文件中搜索 session.save_path 來修改保存路徑
2)設置
下標法設定數組
$_Session [『name』] = 『』
3)數據類型
可以是標量與複合類型
4)刪除
Unset($_Session[『要刪除的 Session名稱』])
刪除session所有數據可直接給它賦一個空數組$_SESSION = [];
※雖然unset($_SESSION)可刪除所有數據,但$_SESSION被釋放了,再次使用的時候需要進行初始化
5)銷毀臨時文件
session_destroy ( void )
6)Session_start()
Session_start首先查看Cookie中是否有PHPSESSID,如果沒有會根據瀏覽器的相關信息創建一個能夠確保唯一的字元串,然後再創建一個以sess_ 開頭,以剛才的字元串結尾的文件如果有PHPSESSID信息,則 直接讀取Session文件數據
7)配置項
---在PHP配置文件中設置下列各項
※一般只修改Session的默認名稱
※Session生命周期為0,默認會話結束後銷毀,延長方法:
· 第一種方法
在session_start()前調用 session_set_cookie_params函數,該函數的第一個參數就是延長session中的cookie生命周期,是整形,它的生命周期是按照當前時間開始算 + 參數的值(單位為秒)
· 第二種方式是在session_start後,通過setcookie修改cookie的有效期屬性
4. 二者區別
聯繫:Session依賴Cookie(瀏覽器的身份信息)進行數據的傳遞,禁用Cookie後,Session無法正常使用。
5. Cookie被腦殘用戶主動禁用了怎麼破?
---只要保證始終通過get方式傳遞一個值就行,用瀏覽器的地址欄進行「記憶」
session_id ([ string $id ] )
上述函數可獲取/設置當前會話的 ID,如果指定了 id 參數的值, 則使用指定值作為會話 ID。必須在調用 session_start() 函數之前調用 session_id() 函數。
6. Session回收機制
---php的Session的文件回收是採用概率性的回收機制
概率的計算方式:
sesssion.gc_probability 分子
session.gc_divisor 分母
只要有代碼調用 session_start函數就產生一定的概率,通常大公司的概率會比較低
通過一定的概率,計算文件是否過期,文件是否過期的依據是 當前時間 – 修改時間
如果當前時間 – 修改時間 > 1440 秒,則認為文件過期,需要刪除
如果當前時間 – 修改時間 < 1440 秒,則認為文件沒有過期,不會進行刪除操作
因為刪除session緩存文件會消耗資源,所以我們不會每次調用session_start函數就刪除數據
文末彩蛋:Love May
推薦閱讀: