您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)PHP中Session機(jī)制的原理是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
當(dāng)服務(wù)器創(chuàng)建了一個(gè)session(session_start()),服務(wù)器將會(huì)在服務(wù)器的指定文件夾下創(chuàng)建一個(gè)session文件,其名稱為sessionID,并當(dāng)做cookie的值發(fā)送給瀏覽器。瀏覽器每次訪問(wèn)該服務(wù)器時(shí)便會(huì)帶著這個(gè)cookie,服務(wù)器便會(huì)識(shí)別改sessionID,找到相應(yīng)的session文件。該文件中存放了若干鍵值對(duì)。該session文件所存放的文件夾可以在配置文件php,ini中修改。
cookie 每次請(qǐng)求頁(yè)面的時(shí)候進(jìn)行驗(yàn)證,如果用戶信息存儲(chǔ)在數(shù)據(jù)庫(kù)中,每次都要執(zhí)行一次數(shù)據(jù)庫(kù)查詢,給數(shù)據(jù)庫(kù)造成多余的負(fù)擔(dān)。cookie可以被修改的,所以安全系數(shù)太低。
session是存儲(chǔ)在服務(wù)器端面的會(huì)話,相對(duì)安全,并且不像Cookie那樣有存儲(chǔ)長(zhǎng)度限制。由于Session是以文本文件形式存儲(chǔ)在服務(wù)器端的,所以不怕客戶端修改Session內(nèi)容。實(shí)際上在服務(wù)器端的Session文件,PHP自動(dòng)修改session文件的權(quán)限,只保留了系統(tǒng)讀和寫(xiě)權(quán)限,而且不能通過(guò)ftp修改,所以安全得多。
對(duì)于 Cookie 來(lái)說(shuō),假設(shè)我們要驗(yàn)證用戶是否登陸,就必須在 Cookie 中保存用戶名和密碼(可能是 md5 加密后字符串),并在每次請(qǐng)求頁(yè)面的時(shí)候進(jìn)行驗(yàn)證。
如果用戶名和密碼存儲(chǔ)在數(shù)據(jù)庫(kù),每次都要執(zhí)行一次數(shù)據(jù)庫(kù)查詢,給數(shù)據(jù)庫(kù)造成多余的負(fù)擔(dān)。因?yàn)槲覀儾⒉荒?只做一次驗(yàn)證。為什么呢?
因?yàn)榭蛻舳?Cookie 中的信息是有可能被修改的。假如你存儲(chǔ) $admin 變量來(lái)表示用戶是否登陸,$admin 為 true 的時(shí)候表示登陸,為 false 的時(shí)候表示未登錄,在第一次通過(guò)驗(yàn)證后將 $admin 等于 true 存儲(chǔ)在 Cookie,下次就不用驗(yàn)證了,這樣對(duì)么?錯(cuò)了,假如有人偽造一個(gè)值為 true 的 $admin 變量那不是就立即取的了管理權(quán)限么?非常的不安全。
而 Session 就不同了,Session 是存儲(chǔ)在服務(wù)器端的,遠(yuǎn)程用戶沒(méi)辦法修改 Session 文件的內(nèi)容,因此我們可以單純存儲(chǔ)一個(gè) $admin 變量來(lái)判斷是否登陸,首次驗(yàn)證通過(guò)后設(shè)置 $admin 值為 true,以后判斷該值是否為 true,假如不是,轉(zhuǎn)入登陸界面,這樣就可以減少很多數(shù)據(jù)庫(kù)操作了。
而且可以減少每次為了驗(yàn)證 Cookie 而傳遞密碼的不安全性了(Session 驗(yàn)證只需要傳遞一次,假如你沒(méi)有使用 SSL 安全協(xié)議的話)。即使密碼進(jìn)行了 md5 加密,也是很容易被截獲的。
session 會(huì)話會(huì)為每一個(gè)開(kāi)啟了 session 會(huì)話的訪問(wèn)者建立一個(gè)唯一的會(huì)話 ID ,用于識(shí)別用戶。該會(huì)話 ID 可能存儲(chǔ)于用戶電腦的 cookie 內(nèi),也可能通過(guò) URL 來(lái)傳遞。而對(duì)應(yīng)的具體 session 值會(huì)存儲(chǔ)于服務(wù)器端,這也是與 cookie 的主要區(qū)別,并且安全性相對(duì)較高。
創(chuàng)建 session
要?jiǎng)?chuàng)建 session 或返回已經(jīng)存在的會(huì)話 ,就必須先使用 session_start() 函數(shù)開(kāi)啟一個(gè) session 會(huì)話,系統(tǒng)會(huì)分配一個(gè)會(huì)話 ID:
<?php session_start();//此函數(shù)沒(méi)有參數(shù),且返回值均為true。最好將這個(gè)函數(shù)置于最先,而且在它之前不能有任何輸出,否則會(huì)報(bào)警 ?>
注冊(cè)session變量
使用 session_register() 函數(shù)注冊(cè)一個(gè) session 變量,成功返回 TRUE ,否則返回 FALSE 。
語(yǔ)法:bool session_register( mixed name [, mixed ...] )
使用 session_register() 函數(shù)可以在目前會(huì)話下注冊(cè)一個(gè)或多個(gè)全局 session 變量。 參數(shù)name就是想要加入的變量名,成功則返回邏輯值true。可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式來(lái)取值或賦值。
例子:
<?php session_start(); $username = "nostop"; session_register("username"); ?>
在該例子中,我們向 session 注冊(cè)了一個(gè)名為 username 的變量,其值為 nostop 。
讀取 session
PHP 內(nèi)置的 $_SESSION 變量可以很方便的訪問(wèn)設(shè)置的 session 變量。
例子:
<?php session_start(); echo "登記的用戶名為:".$_SESSION["username"]; //輸出 登記的用戶名為:nostop ?>
銷毀 session
session_unregister() 注銷單個(gè) session 變量
unset($_SESSION['age']); 用于注銷以$_SESSION['age']注冊(cè)的session變量
session_unset() 刪除所有已注冊(cè)的變量
session_destroy() 注銷所有的session變量,并注銷整個(gè) session 會(huì)話
例子:
<?php session_start(); session_unregister("username"); //注銷 session 某個(gè)變量 session_unset(); //注銷 session 會(huì)話 ?>
檢查變量是否被登記為會(huì)話變量
session_is_registered
語(yǔ)法:boobean session_is_registered(string name);
這個(gè)函數(shù)可檢查當(dāng)前的session之中是否已有指定的變量注冊(cè),參數(shù)name就是要檢查的變量名。成功則返回邏輯值true。
例子:
<?php session_start(); if(!session_is_registered("gender")){ //判斷當(dāng)前會(huì)話變量是否注冊(cè) session_register("gender"); //注冊(cè)變量 } $gender="女"; echo $_SESSION['gender']; //女 ?>
存取當(dāng)前會(huì)話名稱
session_name
語(yǔ)法:boolean session_name(string [name]);
這個(gè)函數(shù)可取得或重新設(shè)置當(dāng)前session的名稱。若無(wú)參數(shù)name則表示獲取當(dāng)前session名稱,加上參數(shù)則表示將session名稱設(shè)為參數(shù)name。
例子:
<?php $sessionName = session_name(); //取得當(dāng)前 Session 名,默認(rèn)為 PHPSESSID $sessionID = $_GET[$sessionName]; //取得 Session ID session_id($sessionID); //使用 session_id() 設(shè)置獲得的 Session ID ?>
存取當(dāng)前會(huì)話標(biāo)識(shí)號(hào)
session_id
語(yǔ)法:boolean session_id(string [id]);
這個(gè)函數(shù)可取得或重新設(shè)置當(dāng)前存放session的標(biāo)識(shí)號(hào)。若無(wú)參數(shù)id則表示只獲取當(dāng)前session的標(biāo)識(shí)號(hào),加上參數(shù)則表示將session的標(biāo)識(shí)號(hào)設(shè)成新指定的id。
設(shè)置 Session 的生存期
setcookie:向客戶端發(fā)送一個(gè) HTTP cookie。
<?php session_start // 保存一天 $lifeTime = 24 * 3600; setcookie(session_name(), session_id(), time() + $lifeTime, "/"); ?>
session_set_cookie_params:設(shè)置 Session 的生存期的,該函數(shù)必須在 session_start() 函數(shù)調(diào)用之前調(diào)用。
如果客戶端使用 IE 6.0 , session_set_cookie_params(); 函數(shù)設(shè)置 Cookie 會(huì)有些問(wèn)題,所以我們還是手動(dòng)調(diào)用 setcookie 函數(shù)來(lái)創(chuàng)建 cookie。
// 保存一天
<?php $lifeTime = 24 * 3600; session_set_cookie_params($lifeTime); session_start(); $_session["admin"] = true; ?>
設(shè)置 Session 文件的保存路徑
session_save_path() :必須在 session_start() 函數(shù)調(diào)用之前調(diào)用。
<?php // 設(shè)置一個(gè)存放目錄 $savePath = "./session_save_dir/"; // 保存一天 $lifeTime = 24 * 3600; session_save_path($savePath); session_set_cookie_params($lifeTime); session_start(); $_session["admin"] = true; ?>
<?php session_start(); //啟動(dòng)Session $username='nostop'; session_register('username'); //注冊(cè)一個(gè)名為username變量 echo '登記的用戶:'.$_SESSION['username']; //登記的用戶:nostop 讀取Session變量 $_SESSION['age']=23; //聲明一個(gè)名為age的變量,并賦值 echo '年齡:'.$_SESSION['age']; //年齡:23 session_unregister('username'); //注銷Session變量 echo $_SESSION['username']; //空 echo $_SESSION['age'];//23 unset($_SESSION['age']); //注銷Session變量 echo '登記的用戶:'.$_SESSION['username']; //空 echo '年齡:'.$_SESSION['age']; //空 ?>
上述就是小編為大家分享的PHP中Session機(jī)制的原理是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。