PHP中的session學習

不言
發布: 2023-03-25 12:58:01
原創
1110 人瀏覽過

這篇文章主要介紹了關於PHP中的session學習,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

cookie和session是web開發新手容易搞混的兩個概念,弄清楚兩者有助於對web互動更好的理解。個人認為session和cookie的區別主要有以下幾點:

cookie

#資訊保存在客戶端

#具體實作由客戶端負責

資料大小和數量一般有限制

資料容易被竊取和篡改

session

資料保存在服務端

具體實作由伺服器負責

在資料大小和數量原則上無限制

安全性較高,可信度強

狹義的session指的是web會話中的session id以及關聯的數據,廣義的session指通信雙方的交互會話。例如使用者登入是一次session交互,在ATM機取錢是一次session交互,等等。

session的細節

session的主要作用是識別一個會話,並保存會話期間的資料。以下是session的一些細節。

訪問

PHP透過$_SESSION超全域變數取得並存放session中的所有資料。 $_SESSION是一個數組,可以方便的進行賦值和讀取,例如:

$name = $_SESSION['NAME'];  // 读取session中的name值
$_SESSION['NAME'] = 'new name';   // 赋新值
unset($_SESSION['NAME']);     // 移除session中的值
登入後複製

過期時間

預設session中的資料有可能在session逾時後移除,這取決於PHP是否及時運行垃圾回收。由於PHP運作垃圾回收的係數是請求數,帶來的後果是:1. 低流量的站點超時很久後 session資料也未被移除;2. 大流量站點頻繁的進行session垃圾回收;3. 運行垃圾回收在執行用戶請求前,遇到了運行垃圾回收的用戶可能會感受到系統延遲。一個更好的解決辦法是停用PHP的預設垃圾回收,以cron任務定時執行session_gc函數。這樣既保證session的時效性,也能帶來效能和使用者體驗上的提升。

手動移除session中的資料可以用unset移除單一資料項,或是session_destroy函數暴力刪除所有的資料。

儲存媒體與序列化

session中的資料預設以檔案形式儲存在磁碟上,session開啟時讀取檔案內容反序列化,然後填入$ _SESSION數組。在大流量的網站中,存放session文件的目錄下會包含大量小文件,將對檔案系統造成沉重的IO負擔。

session模組中的handler可以指定資料保存方式,例如存放到資料庫中、redis/memcache等媒體。 PHP內建的handler包括files(預設),redis和memcache。使用者可以透過session_set_save_handler來註冊自己的handler。

session中存放的資料可能是字串等基本類型,也可能是陣列、物件等複雜類型。 session設定中的serialize_handler用來設定序列化和反序列化的handler,hanlder將資料序列化後,交給save_handler儲存。由序列化可知,resource等類型不能也不應該保存到session中。把一個db的連接句柄保存到session中,然後10分鐘後再取出來用,這樣的想法應該盡快被拋掉。

session設定名稱

由於http是無狀態協議,客戶端請求時需要攜帶session id才能讓服務端區分出session。預設的標識session id的名稱是PHPSESSID,可以使用session_name來設定其他的名稱。例如為了防止攻擊者猜出後端是PHP語言的系統,可以設定session id的名稱為JSESSIONID,迷惑攻擊者。

session自動開啟

目前主流的PHP版本預設都不會自動開啟session。例如某個訪客就隨便看一下頁面就離開,如果自動開啟session,將進行一系列的初始化操作後將session id送到客戶端,以便下次造訪時能辨識出使用者。對於一次性的訪客,或非系統的登入用戶,這些操作只會帶來額外的開銷。

session不自動開啟的劣勢是使用session前,要確保session已經打開,否則可能會取到空資料。如果重新命名了預設的session名稱,則需要在session_start前呼叫session_name指示目前使用的session名稱。

分散式session

大流量的站點,後端提供服務的往往不只一台PHP伺服器。如果使用者的多次請求不是落在同一台伺服器上,而伺服器的session資料不共享,可能導致要求使用者重複登入的情況發生。解決這個問題的方案既可在前端請求分發做,也可在後端透過設定分散式共享session來實現。

以檔案儲存session資料的系統中,可以指定某個目錄為共享目錄,所有伺服器的session都保存在該目錄下;以redis/memcache/db等方式存放session的系統中,設定連接到同一個session伺服器即可做到session共享。以session共享方式搭建的系統,前端負載平衡器可以隨意分發請求到任意伺服器上。

相關推薦:

PHP登入session的取得

#PHP實作多伺服器SESSION共用


以上是PHP中的session學習的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!