溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中Session機(jī)制的原理是什么

發(fā)布時(shí)間:2021-01-26 16:28:13 來(lái)源:億速云 閱讀:147 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這期內(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中修改。

PHP中Session機(jī)制的原理是什么

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è)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI