了解php中session垃圾回收機制
我們先來分析一下PHP中是怎麼產生一個session的。設計出session的目的是保持每個使用者的各種狀態來彌補HTTP協定的不足(無狀態)。我們現在有一個疑問,我們都知道session是保存在伺服器的,既然它用來保持每個使用者的狀態那它利用什麼來區別使用者的呢?這時候就得借助cookie了。當我們在程式碼中呼叫session_start();時,PHP會同時往SESSION的存放目錄(預設為/tmp/)和客戶端的cookie目錄各產生一個檔案。 session檔名這樣:
格式為sess_{SESSIONID} ,這時session檔案中沒有任何內容,當我們在session_start();新增了這兩行程式碼:
$_SESSION['name'] = 'wanchun0222';$_SESSION['blog'] = 'coderbolg.net'; 这时文件就有内容了:
name|s:11:"wanchun0222";blog|s:13:"coderbolg.net";
這時再看看cookie:
可以看到伺服器為我們自動產生了一個cookie,cookie名稱為"PHPSESSID",cookie內容是一串字符,其實這串字元就是{SESSIONID}。也許你已經明白了,當我們使用session時,PHP就先生成一個唯一的SESSIONID號(如2bd170b3f86523f1b1b60b55ffde0f66),再在我們伺服器的預設目錄下產生一個文件,文件名稱為sIONID同時在目前使用者的客戶端產生一個cookie,內容已經說過了。這樣PHP會為每一個使用者產生一個SESSIONID,也就是說一個使用者一個session檔。 PHP第一次為某個使用者使用session時就向客戶端寫入了cookie,當這個使用者以後造訪時,瀏覽器會帶著這個cookie,PHP在拿到cookie後就讀出裡面的SESSIONID,拿著這個SESSIONID去session目錄下找session檔。找到後在呼叫$_SESSION['blog']的時候顯示出來。
session.gc_maxlifetime為session設定了生存時間(預設為1440s)。如果session檔案的最後更新時間到現在超過了生存時間,這個session檔案就被認為是過期的了。在下一次session回收的時候就會被刪除。那下一次session回收是在什麼時候呢?這和php請求次數有關的。在PHP內部機制中,當php被請求了N次後就會有一次觸發回收機制。到底是請求多少次觸發一次是透過以下兩個參數控制的:
session.gc_probability = 1session.gc_divisor = 100
这是php.ini的默认设置,意思是每100次PHP请求就有一次回收发生。概率是 gc_probability/gc_divisor 。我们了解了服务器端的session过期机制,再来看看客户端的cookie的过期机制。
如果cookie失效了浏览器自然发送不了cookie到服务器,这时即使服务器的session文件存在也没用,因为PHP不知道要读取哪个session文件。我们知道PHP的cookie过期时间是在创建时设置的,那么PHP在创建session的同时为客户端创建的cookie的生命周期是多久呢?这个在php.ini中有设置:session.cookie_lifetime 。这个值默认是0,代表浏览器一关闭SESSIONID就失效。那就是说我们把session.gc_maxlifetime和session.cookie_lifetime设置成同一个值就可以控制session的失效时间了。
由上面的介绍我们可以知道,如果用户关闭了cookie,那我们的session就完全没法工作了。是的,确实是这样。php中session的客户端存储机制只有cookie吗?不是的。既然我们的SESSIONID 不能通过cookie传递到各个页面,那我们还有另一个法宝,就是通过页面GET传值的方式。
PHP可以在cookie被禁用时自动通过GET方式跨页传递SESSIONID,前提是设置php.ini的session.use_trans_sid为1。这时当我们在客户端禁用了cookie时使用了session,并在当前页面通过点击链接到另一页面时,PHP会自动在链接上添加SESSIONID参数,像这样:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想你应该看到了这种方式的缺点:好像不够安全啊。
以上是了解php中session垃圾回收機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

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

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

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

Dreamweaver CS6
視覺化網頁開發工具

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

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

vscode 內置終端是一個開發工具,允許在編輯器內運行命令和腳本,以簡化開發流程。如何使用 vscode 終端:通過快捷鍵 (Ctrl/Cmd ) 打開終端。輸入命令或運行腳本。使用熱鍵 (如 Ctrl L 清除終端)。更改工作目錄 (如 cd 命令)。高級功能包括調試模式、代碼片段自動補全和交互式命令歷史。

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

在 Sublime 中運行代碼的方法有六種:通過熱鍵、菜單、構建系統、命令行、設置默認構建系統和自定義構建命令,並可通過右鍵單擊項目/文件運行單個文件/項目,構建系統可用性取決於 Sublime Text 的安裝情況。
