了解php中session垃圾回收機制
Aug 08, 2024 am 09:08 AM我們先來分析一下PHP中是怎麼產(chǎn)生一個session的。設(shè)計出session的目的是保持每個使用者的各種狀態(tài)來彌補HTTP協(xié)定的不足(無狀態(tài))。我們現(xiàn)在有一個疑問,我們都知道session是保存在伺服器的,既然它用來保持每個使用者的狀態(tài)那它利用什麼來區(qū)別使用者的呢?這時候就得借助cookie了。當(dāng)我們在程式碼中呼叫session_start();時,PHP會同時往SESSION的存放目錄(預(yù)設(shè)為/tmp/)和客戶端的cookie目錄各產(chǎn)生一個檔案。 session檔名這樣:
格式為sess_{SESSIONID} ,這時session檔案中沒有任何內(nèi)容,當(dāng)我們在session_start();新增了這兩行程式碼:
$_SESSION['name'] = 'wanchun0222';$_SESSION['blog'] = 'coderbolg.net'; 這時文件就有內(nèi)容了:
name|s:11:"wanchun0222";blog|s:13:"coderbolg.net";
這時再看看cookie:
可以看到伺服器為我們自動產(chǎn)生了一個cookie,cookie名稱為"PHPSESSID",cookie內(nèi)容是一串字符,其實這串字元就是{SESSIONID}。也許你已經(jīng)明白了,當(dāng)我們使用session時,PHP就先生成一個唯一的SESSIONID號(如2bd170b3f86523f1b1b60b55ffde0f66),再在我們伺服器的預(yù)設(shè)目錄下產(chǎn)生一個文件,文件名稱為sIONID同時在目前使用者的客戶端產(chǎn)生一個cookie,內(nèi)容已經(jīng)說過了。這樣PHP會為每一個使用者產(chǎn)生一個SESSIONID,也就是說一個使用者一個session檔。 PHP第一次為某個使用者使用session時就向客戶端寫入了cookie,當(dāng)這個使用者以後造訪時,瀏覽器會帶著這個cookie,PHP在拿到cookie後就讀出裡面的SESSIONID,拿著這個SESSIONID去session目錄下找session檔。找到後在呼叫$_SESSION['blog']的時候顯示出來。
session.gc_maxlifetime為session設(shè)定了生存時間(預(yù)設(shè)為1440s)。如果session檔案的最後更新時間到現(xiàn)在超過了生存時間,這個session檔案就被認(rèn)為是過期的了。在下一次session回收的時候就會被刪除。那下一次session回收是在什麼時候呢?這和php請求次數(shù)有關(guān)的。在PHP內(nèi)部機制中,當(dāng)php被請求了N次後就會有一次觸發(fā)回收機制。到底是請求多少次觸發(fā)一次是透過以下兩個參數(shù)控制的:
session.gc_probability = 1session.gc_divisor = 100
這是php.ini的默認(rèn)設(shè)置,意思是每100次PHP請求就有一次回收發(fā)生。概率是 gc_probability/gc_divisor 。我們了解了服務(wù)器端的session過期機制,再來看看客戶端的cookie的過期機制。
如果cookie失效了瀏覽器自然發(fā)送不了cookie到服務(wù)器,這時即使服務(wù)器的session文件存在也沒用,因為PHP不知道要讀取哪個session文件。我們知道PHP的cookie過期時間是在創(chuàng)建時設(shè)置的,那么PHP在創(chuàng)建session的同時為客戶端創(chuàng)建的cookie的生命周期是多久呢?這個在php.ini中有設(shè)置:session.cookie_lifetime 。這個值默認(rèn)是0,代表瀏覽器一關(guān)閉SESSIONID就失效。那就是說我們把session.gc_maxlifetime和session.cookie_lifetime設(shè)置成同一個值就可以控制session的失效時間了。
由上面的介紹我們可以知道,如果用戶關(guān)閉了cookie,那我們的session就完全沒法工作了。是的,確實是這樣。php中session的客戶端存儲機制只有cookie嗎?不是的。既然我們的SESSIONID 不能通過cookie傳遞到各個頁面,那我們還有另一個法寶,就是通過頁面GET傳值的方式。
PHP可以在cookie被禁用時自動通過GET方式跨頁傳遞SESSIONID,前提是設(shè)置php.ini的session.use_trans_sid為1。這時當(dāng)我們在客戶端禁用了cookie時使用了session,并在當(dāng)前頁面通過點擊鏈接到另一頁面時,PHP會自動在鏈接上添加SESSIONID參數(shù),像這樣:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想你應(yīng)該看到了這種方式的缺點:好像不夠安全啊。
以上是了解php中session垃圾回收機制的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

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

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

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

熱門話題

在CentOS上集成Postman應(yīng)用可以通過多種方法來實現(xiàn),以下是詳細(xì)的步驟和建議:通過下載安裝包安裝Postman下載Postman的Linux版本安裝包:訪問Postman官方網(wǎng)站,選擇適用於Linux的版本進(jìn)行下載。解壓安裝包:使用以下命令將安裝包解壓到指定目錄,例如/opt:sudotar-xzfpostman-linux-x64-xx.xx.xx.tar.gz-C/opt請注意將“postman-linux-x64-xx.xx.xx.tar.gz”替換為您實際下載的文件名。創(chuàng)建符號

【常見目錄說明】目錄/bin存放二進(jìn)制可執(zhí)行文件(ls,cat,mkdir等),常用命令一般都在這裡。 /etc存放系統(tǒng)管理和配置文件/home存放所有用戶文件的根目錄,是用戶主目錄的基點,比如用戶user的主目錄就是/home/user,可以用~user表示/usr用於存放系統(tǒng)應(yīng)用程序,比較重要的目錄/usr/local?本地系統(tǒng)管理員軟件安裝目錄(安裝系統(tǒng)級的應(yīng)用)。這是最龐大的目錄,要用到的應(yīng)用程序和文件幾乎都在這個目錄。 /usr/x11r6?存放x?window的目錄/usr/bin?眾多

在PyCharm中設(shè)置解釋器的位置可以通過以下步驟實現(xiàn):1.打開PyCharm,點擊“File”菜單,選擇“Settings”或“Preferences”。 2.找到並點擊“Project:[你的項目名]”,然後選擇“PythonInterpreter”。 3.點擊“AddInterpreter”,選擇“SystemInterpreter”,瀏覽到Python安裝目錄,選中Python可執(zhí)行文件,點擊“OK”。設(shè)置解釋器時需注意路徑正確性、版本兼容性和虛擬環(huán)境的使用,以確保項目順利運行。

Java與其他編程語言的主要區(qū)別在於其“一次編寫,到處運行”的跨平臺特性。 1.Java的語法接近C ,但去掉了容易出錯的指針操作,適合大型企業(yè)應(yīng)用。 2.與Python相比,Java在性能和大規(guī)模數(shù)據(jù)處理上更具優(yōu)勢。 Java的跨平臺優(yōu)勢源於Java虛擬機(JVM),它能在不同平臺上運行相同的字節(jié)碼,簡化開發(fā)和部署,但需注意避免使用平臺特定API以保持跨平臺性。

了解Nginx的配置文件路徑和初始設(shè)置非常重要,因為它是優(yōu)化和管理Web服務(wù)器的第一步。 1)配置文件路徑通常是/etc/nginx/nginx.conf,使用nginx-t命令可以查找並測試語法。 2)初始設(shè)置包括全局設(shè)置(如user、worker_processes)和HTTP設(shè)置(如include、log_format),這些設(shè)置允許根據(jù)需求進(jìn)行定制和擴展,錯誤配置可能導(dǎo)致性能問題和安全漏洞。

MySQL的安裝和配置可以通過以下步驟完成:1.從官方網(wǎng)站下載適合操作系統(tǒng)的安裝包。 2.運行安裝程序,選擇“開發(fā)者默認(rèn)”選項並設(shè)置root用戶密碼。 3.安裝後配置環(huán)境變量,確保MySQL的bin目錄在PATH中。 4.創(chuàng)建用戶時遵循最小權(quán)限原則並設(shè)置強密碼。 5.優(yōu)化性能時調(diào)整innodb_buffer_pool_size和max_connections參數(shù)。 6.定期備份數(shù)據(jù)庫並優(yōu)化查詢語句以提高性能。

Informix和MySQL均為廣受青睞的關(guān)係型數(shù)據(jù)庫管理系統(tǒng),它們在Linux環(huán)境下均表現(xiàn)優(yōu)異並得到廣泛應(yīng)用。以下是對兩者在Linux平臺上的對比分析:安裝與配置Informix:在Linux上部署Informix需要下載對應(yīng)的安裝文件,隨後依據(jù)官方文檔指引完成安裝及配置流程。 MySQL:MySQL的安裝過程較為簡便,可通過系統(tǒng)的包管理工具(例如apt或yum)輕鬆實現(xiàn)安裝,並且網(wǎng)絡(luò)上有大量的教程和社區(qū)支持可供參考。性能表現(xiàn)Informix:Informix以卓越的性能和

參加VSCode線下技術(shù)交流活動的經(jīng)驗非常豐富,主要收穫包括插件開發(fā)的分享、實戰(zhàn)演示和與其他開發(fā)者的交流。 1.插件開發(fā)的分享:了解瞭如何利用VSCode的插件API提升開發(fā)效率,如自動格式化和靜態(tài)分析插件。 2.實戰(zhàn)演示:學(xué)習(xí)瞭如何使用VSCode進(jìn)行遠(yuǎn)程開發(fā),認(rèn)識到其靈活性和擴展性。 3.與開發(fā)者交流:獲取了優(yōu)化VSCode啟動速度的技巧,如減少啟動時加載的插件數(shù)量和管理插件加載順序??傊?,這次活動讓我受益匪淺,強烈推薦對VSCode感興趣的人參加。
