PHP-SESSION深入理解
1.瀏覽器窗口與SESSION間的關(guān)系
記得去年的時(shí)候網(wǎng)上搶手機(jī)(你懂的), 特意開兩個(gè)窗口, 哪個(gè)進(jìn)度快用哪個(gè).如此到輸入驗(yàn)證碼的時(shí)候老是出錯(cuò), 結(jié)果----沒搶到~
后來寫了個(gè)程序, 如下:
1 <?php 2 session_start(); 3 if (!isset($_SESSION['time'])) { 4 $_SESSION['time'] = microtime(true); 5 } 6 echo $_SESSION['time'];三種情況:
火狐打開一個(gè)窗口兩個(gè)標(biāo)簽, 依次訪問http://localhost/test/session.php, 返回結(jié)果相等, IE同是
火狐打開兩個(gè)窗口, 依次訪問http://localhost/test/session.php, 返回結(jié)果相等, IE同是
火狐打開一個(gè)窗口,? IE打開一個(gè)窗口依次訪問http://localhost/test/session.php, 返回結(jié)果不等
結(jié)論:
一個(gè)瀏覽器不論多少窗口, 共用一個(gè)SESSIONID.輸入驗(yàn)證碼錯(cuò)誤的原因就是打開第一個(gè)頁(yè)面拿著SESSIONID去服務(wù)器刷出一個(gè)CODE存到SESSION里, 第二個(gè)頁(yè)面同時(shí)也拿著同一個(gè)SESSIONID去服務(wù)器刷, 此時(shí)服務(wù)器存儲(chǔ)的CODE為第二次刷的.回到第一個(gè)窗口輸入顯示的驗(yàn)證碼, 肯定錯(cuò)誤了.
session在客戶端是根據(jù)瀏覽器類型(IE, 火狐, Chrome等)存儲(chǔ)SESSIONID,? 不是根據(jù)窗口或者選項(xiàng)卡. 瀏覽器拿著此SESSIONID去服務(wù)器獲取存儲(chǔ)的數(shù)據(jù).
2.SESSION函數(shù)
session_start(): 開啟SESSION
session_name(): 獲取SESSION鍵值對(duì)的鍵(默認(rèn)為PHPSESSID, 可以查看COOKIE)
session_id(): 獲取SESSION鍵值對(duì)的值(服務(wù)器根據(jù)一定算法得出來的唯一值, 比如md5(客戶端IP . 當(dāng)前秒數(shù) . 隨機(jī)數(shù)))
3.SESSION流程
客戶端訪問服務(wù)器, 服務(wù)器產(chǎn)生一個(gè)唯一SESSIONID, 通過HTTP響應(yīng)頭Set-Cookie:PHPSESSID(PHP.INI中session.name, 及session_name()一樣的值)=SESSIONID(同session_id()一樣的值), 把SESSIONID存儲(chǔ)到瀏覽器, 瀏覽器再次訪問服務(wù)器的時(shí)候HTTP請(qǐng)求頭會(huì)帶上PHPSESSID=SID, 如果用戶禁用了COOKIE, 可以通過URL附帶session_name()=session_id(), 服務(wù)器獲取到SESSIONID后即可通過$_SESSION獲取SESSION的值.
4.SESSION誤解
關(guān)掉瀏覽器SESSION就消失的原因是錯(cuò)誤的, 因?yàn)榉?wù)器根本無法知道用戶是否關(guān)閉了瀏覽器, 服務(wù)器只能靠SESSION時(shí)間過期來刪除(具體刪除原理繼續(xù)往下看). 倘若原來的SESSIONID未過期, 那么修改HTTP請(qǐng)求頭, 拿著此SESSIONID依舊可以獲得存儲(chǔ)的值.
5.SESSION的配置
平時(shí)用到的SESSION配置有:
session.save_handler=file //指定服務(wù)器端存儲(chǔ)SESSION的方式, 默認(rèn)為文件存儲(chǔ)
session.save_path="C:/Users/oo/AppData/Local/Temp" //如果SESSION的存儲(chǔ)方式是以文件存儲(chǔ)的, 這項(xiàng)配置是指定存儲(chǔ)到哪個(gè)路徑下
session.use_cookies=1 //是否用COOKIE來存儲(chǔ)SESSIONID, 若為0, 可以用URL傳值的方式
session.name=PHPSESSID //默認(rèn)的SESSION存儲(chǔ)時(shí)鍵名
session.auto_start=0 //是否自動(dòng)開啟SESSION, 若為1, 則使用SESSION前不用session_start()
session.cookie_lifetime=0 //存儲(chǔ)到客戶端COOKIE時(shí)間, 0表示關(guān)閉瀏覽器此COOKIE就消失
session.cookie_path=/ //哪個(gè)目錄訪問時(shí)帶上此COOKIE
session.cookie_domain= //指定域
session.serialize_handler=php //用什么對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行序列化
session.gc_probability=1 //此兩條看文章下文的回收機(jī)制
session.gc_divisor=100
session.gc_maxlifetime=1440 //設(shè)置SESSION的生存期限
6.session回收機(jī)制
由于PHP為單線程, 也就不能創(chuàng)建DAEMON自動(dòng)去清除過時(shí)的SESSION, 只能靠用戶訪問來自動(dòng)觸發(fā), 或者Linux自定義任務(wù). 靠用戶訪問觸發(fā)的原理為用戶每次請(qǐng)求時(shí), 在1和session.gc_divisor之間rand一個(gè)值, 如果此值<=session.gc_probability, 則服務(wù)器去清除過時(shí)的SESSION文件(把handler交給數(shù)據(jù)庫(kù)的話服務(wù)器就不會(huì)管了), 這樣就實(shí)現(xiàn)了session.gc_probability / session.gc_divisor概率去刪除SESSION文件, 大體就這么個(gè)原理吧. 具體暫不知道.
7.session保存到數(shù)據(jù)庫(kù)
轉(zhuǎn)載于:https://www.cnblogs.com/JohnABC/p/3246068.html
總結(jié)
以上是生活随笔為你收集整理的PHP-SESSION深入理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 韦东山驱动视频笔记——3.字符设备驱动程
- 下一篇: PHP中文URL编解码(urlencod