簡單PHP會話(session)說明介紹
現(xiàn)在程序員愈發(fā)的不容易了,想要精通,必然要尋本溯源,這其實(shí)與目前泛濫的愈發(fā)高級的語言以及眾多的框架剛好相反,因?yàn)樗鼈冊诒M可能的掩蓋本源使其簡單,個人稱之為程序員學(xué)習(xí)悖論。
注:作者接觸web開發(fā)和php兩周左右,以下內(nèi)容適合初學(xué)者。
1、導(dǎo)讀
從文題目看,<簡單PHP會話(Session)說明> 是已經(jīng)圈定了本文的內(nèi)容范圍,試圖闡明Session(文中對會話稱為Session) 在PHP語言中是如何實(shí)現(xiàn)以及使用的,重點(diǎn)在于基本理解后的使用。
文章思路是首先搞清楚session是什么東西,Session有什么用,Session使用的套路是什么,PHP中是如何使用的。
2、會話(Session)說明
開始前,首先推薦一本基礎(chǔ)理論書《HTTP權(quán)威指南》,是程序員基礎(chǔ)必備知識,作者有電子版,有需要的可以留言。
a. Session的由來
幾乎每個人都上網(wǎng),數(shù)以億計(jì)的數(shù)據(jù)在網(wǎng)絡(luò)中相互傳輸,數(shù)據(jù)之所以能夠安全的傳輸,是基于HTTP協(xié)議的,很是耳熟能詳是吧。其實(shí)HTTP協(xié)議所干的事情就是提供完成你的網(wǎng)絡(luò)訪問一系列方法,雙方構(gòu)建了一次訪問,原則上就是一個會話建立了。說一個例子:小明在瀏覽器中輸入https://www.baidu.com/(HTTPS是HTTP的加密版本,相比是增加了SSL加密層),這是小明對百度發(fā)起了一個請求,說:“我要看你的界面”,百度的服務(wù)器們收到信息,信息中包括了小名想干的事情,同時包括了小明的地址(否則百度不知道把內(nèi)容給誰了),服務(wù)器核對信息OK,對小明這個請求進(jìn)行備案,發(fā)送出小名想要的東西,一次完整的請求結(jié)束了。 這就是一次會話,會話的核心在于小明的信息備案(其實(shí)還涉及到TCP/IP的連接問題,這個與本文無關(guān),忽略)。
其實(shí)與其說是構(gòu)建了一個Session,倒不如說將一次訪問概括為一個Session。
b. Session能干什么用
從上面內(nèi)容可以得到,每一個訪問都是一個會話,服務(wù)器都要備案信息,這是有開銷的,同時呢,也不大可能同一個人連續(xù)訪問十次二十次就構(gòu)建保存十次二十次,一個是增加開銷,另一個是也比較蠢了。也就是說,一個人(確切說是同一個電腦和瀏覽器),在某個特定時間內(nèi),能夠復(fù)用一個Session的,為什么在特定時間內(nèi)呢?因?yàn)镾ession是有默認(rèn)的過期時間,過期后服務(wù)器就清理掉了(如果不這樣,你想想世界那么多人,來一個保留一個,太虧)。
ok,既然同一個人,多次訪問都是一個Session(不要懷疑服務(wù)器無法判別是同一個人,具體可以看上面推介的書),而且每次訪問的內(nèi)容都是做備案的,那么也就是說,你Session周期內(nèi)所有的行為服務(wù)器都是知道的,那么接下來重要的作用就來了,服務(wù)器通過對你的訪問請求分析,能夠獲知到這個特定用戶的行為偏好的,通過做一定的分析,能夠推送一些用戶喜歡關(guān)心的數(shù)據(jù),廣告定向也就是這么來的。
當(dāng)然可能還有其他的用戶,性能等等之類的,個人不是特別理解機(jī)理,這里就這樣。
3、PHP中Session的使用
通過上面的啰嗦,可以發(fā)現(xiàn),Session這個概念其實(shí)是在服務(wù)器端發(fā)生的。PHP提供了一系列的配置、函數(shù)等,很好的實(shí)現(xiàn)Session功能。Session支持在 PHP 中是在并發(fā)訪問時由一個方法來保存某些數(shù)據(jù).從而使你能夠構(gòu)建更多的定制程序 從而提高你的 web 網(wǎng)站的吸引力. 一個訪問者訪問你的 web 網(wǎng)站將被分配一個唯一的 id, 就是所謂的session id. 這個 id 可以存儲在用戶端的一個 cookie 中,也可以通過 URL 進(jìn)行傳遞.會話支持允許你將請求中的數(shù)據(jù)保存在超全局?jǐn)?shù)組$_SESSION中. 當(dāng)一個訪問者訪問你的網(wǎng)站,PHP 將自動檢查(如果 session.auto_start 被設(shè)置為 1)或者在你要求下檢查(明確通過session_start()或者隱式通過session_register()) 當(dāng)前session id 是否是先前發(fā)送的請求創(chuàng)建. 如果是這種情況, 那么先前保存的環(huán)境將被重建.
a. php中session基本用法
通過為每個獨(dú)立用戶分配唯一的Session ID,可以實(shí)現(xiàn)針對不同用戶分別存儲數(shù)據(jù)的功能。 會話通常被用來在多個頁面請求之間保存及共享信息。 一般來說,Session ID 通過 cookie 的方式發(fā)送到瀏覽器,并且在服務(wù)器端也是通過會話 ID 來取回會話中的數(shù)據(jù)。 如果請求中不包含會話 ID 信息,那么 PHP 就會創(chuàng)建一個新的Session,并為新創(chuàng)建的Session分配新的 ID。
Session的工作流程很簡單。當(dāng)開始一個Session時,PHP 會嘗試從請求中查找Session ID (通常通過Session cookie), 如果請求中不包含Session ID 信息,PHP 就會創(chuàng)建一個新的Session。 Session開始之后,PHP 就會將Session中的數(shù)據(jù)設(shè)置到 $_SESSION變量中。 當(dāng) PHP 停止的時候,它會自動讀取$_SESSION中的內(nèi)容,并將其進(jìn)行序列化, 然后發(fā)送給會話保存管理器器來進(jìn)行保存。默認(rèn)情況下,PHP 使用內(nèi)置的文件Session保存管理器(files)來完成Session的保存。 也可以通過配置項(xiàng)session.save_handler(php.ini中配置項(xiàng)目)來修改所要采用的Session保存管理器。 對于文件Session保存管理器,Session會話數(shù)據(jù)保存到配置項(xiàng)session.save_path (php.ini中配置項(xiàng)目)所指定的位置??梢酝ㄟ^調(diào)用函數(shù)session_start來手動開始一個會話。 如果配置項(xiàng)session.auto_start 設(shè)置為1, 那么請求開始的時候,Session會自動開始。PHP 腳本執(zhí)行完畢之后,session會自動關(guān)閉。 同時,也可以通過調(diào)用函數(shù)session_wirte_close() 來手動關(guān)閉會話。
b. php中session信息在php.ini中配置
這部分內(nèi)容放在這里說是因?yàn)?,不說明前面問題,鬼知道php.ini中的配置是什么東西。 上面提到的session.save_handler和session.save_path,這兩個就是php.ini中的配置項(xiàng)目,這里面這塊不細(xì)說,因?yàn)閜hp手冊實(shí)在是太詳細(xì)了。本文默認(rèn)模式是files。
c. php中的session機(jī)制
session_start()是session機(jī)制的開始,session會判斷當(dāng)前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE鍵值,如果不存在會生成一個session_id,然后把生成的session_id作為COOKIE的值傳遞到客戶端.相當(dāng)于執(zhí)行了下面COOKIE 操作。相反,如果存在session_id =$_COOKIE[session_name];然后去session.save_path指定的文件夾里去找名字為'SESS_'.session_id()的文件.讀取文件的內(nèi)容反序列化,然后放到$_SESSION中。
在會話結(jié)束的時候,會執(zhí)行Session寫入操作或是手工執(zhí)行session_write_close()操作。
代碼里面銷毀Session一般有三個方法,
1. setcookie(session_name(),session_id(),time() -8000000,..); //退出登錄前執(zhí)行
2. usset($_SESSION); //這會刪除所有的$_SESSION數(shù)據(jù),刷新后,有COOKIE傳過來,但是沒有數(shù)據(jù)。
3. session_destroy(); //刪除$_SESSION 刪除session文件以及session_id
附錄,引用網(wǎng)絡(luò)上的一段代碼,作為結(jié)尾吧。
<span style="white-space:pre"> </span>//SESSION初始化的時候調(diào)用 function open($save_path, $session_name) { global $sess_save_path; $sess_save_path=$save_path; return(true); } //關(guān)閉的時候調(diào)用 function close() { return(true); } function read($id) { global $sess_save_path; $sess_file="$sess_save_path/sess_$id"; return (string) @file_get_contents($sess_file); } //腳本執(zhí)行結(jié)束之前,執(zhí)行寫入操作 function write($id,$sess_data) { global$sess_save_path; $sess_file="$sess_save_path/sess_$id"; if ($fp= @fopen($sess_file,"w")) { $return=fwrite($fp,$sess_data); fclose($fp); return$return; } else { return(false); } } function destroy($id) { global $sess_save_path; $sess_file="$sess_save_path/sess_$id"; return(@unlink($sess_file)); } function gc($maxlifetime) { global$sess_save_path; foreach (glob("$sess_save_path/sess_*") as$filename) { if (filemtime($filename) +$maxlifetime<time()) { @unlink($filename); } } return true; }
以上這篇簡單PHP會話(session)說明介紹就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- PHP session 會話處理函數(shù)
- php中session_id()函數(shù)詳細(xì)介紹,會話id生成過程及session id長度
- php使用MySQL保存session會話的方法
- php使用MySQL保存session會話的方法
- php實(shí)現(xiàn)session自定義會話處理器的方法
- PHP會話控制:Session與Cookie詳解
- 一個嚴(yán)格的PHP Session會話超時時間設(shè)置方法
- 使用PHP會話(Session)實(shí)現(xiàn)用戶登陸功能
- PHP session會話的安全性分析
- 推薦學(xué)習(xí)php sesson的朋友必看PHP會話(Session)使用入門
- 比較全的PHP 會話(session 時間設(shè)定)使用入門代碼
相關(guān)文章
PHP 雙鏈表(SplDoublyLinkedList)簡介和使用實(shí)例
這篇文章主要介紹了PHP 雙鏈表(SplDoublyLinkedList)簡介和使用實(shí)例的相關(guān)資料,需要的朋友可以參考下2015-05-05PHP使用range協(xié)議實(shí)現(xiàn)輸出文件斷點(diǎn)續(xù)傳代碼實(shí)例
這篇文章主要介紹了PHP使用range協(xié)議實(shí)現(xiàn)輸出文件斷點(diǎn)續(xù)傳代碼實(shí)例,需要的朋友可以參考下2014-07-07用PHP做了一個領(lǐng)取優(yōu)惠券活動的示例代碼
這篇文章主要介紹了用PHP做了一個領(lǐng)取優(yōu)惠券活動的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07