PHP中的session學習
這篇文章主要介紹了關於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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
