§12.PHP會話技術

§12.PHP會話技術

來自專欄 PHP Cooking+

本文獻給本專欄的19位粉絲

1703年,英語里有了cookie一詞,它源於荷蘭語的koekje,意為「小蛋糕」

1994年,網景公司的程序員Lou Montulli提出了將cookie用於網路會話的想法

Cookie提出者Lou Montulli

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. 二者區別

Cookie與Session主要區別

聯繫: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

推薦閱讀:

TAG:PHP | PHP入門 | PHP學習 |