PHP Session機(jī)制簡(jiǎn)介及用法
當(dāng)服務(wù)器創(chuàng)建了一個(gè)session(session_start()),服務(wù)器將會(huì)在服務(wù)器的指定文件夾下創(chuàng)建一個(gè)session文件,其名稱為sessionID,并當(dāng)做cookie的值發(fā)送給瀏覽器。瀏覽器每次訪問該服務(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)讀和寫權(quán)限,而且不能通過ftp修改,所以安全得多。
對(duì)于 Cookie 來說,假設(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 變量來表示用戶是否登陸,$admin 為 true 的時(shí)候表示登陸,為 false 的時(shí)候表示未登錄,在第一次通過驗(yàn)證后將 $admin 等于 true 存儲(chǔ)在 Cookie,下次就不用驗(yàn)證了,這樣對(duì)么?錯(cuò)了,假如有人偽造一個(gè)值為 true 的 $admin 變量那不是就立即取的了管理權(quán)限么?非常的不安全。
而 Session 就不同了,Session 是存儲(chǔ)在服務(wù)器端的,遠(yuǎn)程用戶沒辦法修改 Session 文件的內(nèi)容,因此我們可以單純存儲(chǔ)一個(gè) $admin 變量來判斷是否登陸,首次驗(yàn)證通過后設(shè)置 $admin 值為 true,以后判斷該值是否為 true,假如不是,轉(zhuǎn)入登陸界面,這樣就可以減少很多數(shù)據(jù)庫(kù)操作了。
而且可以減少每次為了驗(yàn)證 Cookie 而傳遞密碼的不安全性了(Session 驗(yàn)證只需要傳遞一次,假如你沒有使用 SSL 安全協(xié)議的話)。即使密碼進(jìn)行了 md5 加密,也是很容易被截獲的。
session 會(huì)話會(huì)為每一個(gè)開啟了 session 會(huì)話的訪問者建立一個(gè)唯一的會(huì)話 ID ,用于識(shí)別用戶。該會(huì)話 ID 可能存儲(chǔ)于用戶電腦的 cookie 內(nèi),也可能通過 URL 來傳遞。而對(duì)應(yīng)的具體 session 值會(huì)存儲(chǔ)于服務(wù)器端,這也是與 cookie 的主要區(qū)別,并且安全性相對(duì)較高。
創(chuàng)建 session
要?jiǎng)?chuàng)建 session 或返回已經(jīng)存在的會(huì)話 ,就必須先使用 session_start() 函數(shù)開啟一個(gè) session 會(huì)話,系統(tǒng)會(huì)分配一個(gè)會(huì)話 ID:
<?php session_start();//此函數(shù)沒有參數(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]的形式來取值或賦值。
例子:
<?php session_start(); $username = "nostop"; session_register("username"); ?>
在該例子中,我們向 session 注冊(cè)了一個(gè)名為 username 的變量,其值為 nostop 。
讀取 session
PHP 內(nèi)置的 $_SESSION 變量可以很方便的訪問設(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的名稱。若無參數(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)。若無參數(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ì)有些問題,所以我們還是手動(dòng)調(diào)用 setcookie 函數(shù)來創(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']; //空 ?>
相關(guān)文章
PHP下操作Linux消息隊(duì)列完成進(jìn)程間通信的方法
當(dāng)我們開發(fā)的系統(tǒng)需要使用多進(jìn)程方式運(yùn)行時(shí),進(jìn)程間通信便成了至關(guān)重要的環(huán)節(jié)。消息隊(duì)列(message queue)是Linux系統(tǒng)進(jìn)程間通信的一種方式。2010-07-07PHP調(diào)用MySQL的存儲(chǔ)過程的實(shí)現(xiàn)代碼
MySQL好像從5.0開始才引入存儲(chǔ)過程,反正以前做應(yīng)用的時(shí)候從沒碰過,不過現(xiàn)在因?yàn)橹饕鲀?nèi)部系統(tǒng)2008-08-08php使用ffmpeg獲取視頻信息并截圖的實(shí)現(xiàn)方法
這篇文章主要介紹了php使用ffmpeg獲取視頻信息并截圖的實(shí)現(xiàn)方法,實(shí)例分析了php操作視頻與圖像的相關(guān)技巧,需要的朋友可以參考下2016-05-05Yii PHP Framework實(shí)用入門教程(詳細(xì)介紹)
本篇文章是對(duì)Yii PHP Framework實(shí)用入門教程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06基于php導(dǎo)出到Excel或CSV的詳解(附utf8、gbk 編碼轉(zhuǎn)換)
本篇文章是對(duì)php導(dǎo)出到Excel或CSV(附utf8、gbk 編碼轉(zhuǎn)換)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP laravel實(shí)現(xiàn)配置使用多數(shù)據(jù)庫(kù)
有的時(shí)候,我們?cè)陂_發(fā)的過程中需要連接多個(gè)數(shù)據(jù)庫(kù)。Laravel框架中早已為我們想到了這樣的需求。這篇文章主要為大家介紹了laravel配置使用多數(shù)據(jù)庫(kù)的方法,需要的可以參考一下2022-10-10Linux平臺(tái)php命令行程序處理管道數(shù)據(jù)的方法
這篇文章主要介紹了Linux平臺(tái)php命令行程序處理管道數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Linux平臺(tái)管道提示符的功能及php使用命令行處理管道數(shù)據(jù)的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-11-11