溫馨提示×

溫馨提示×

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

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

Session怎么使用

發(fā)布時間:2022-09-28 13:56:27 來源:億速云 閱讀:106 作者:iii 欄目:編程語言

這篇文章主要介紹了Session怎么使用的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Session怎么使用文章都會有所收獲,下面我們一起來看看吧。

Session的聲明與使用

Session的設(shè)置不同于Cookie,必須先啟動,在PHP中必須調(diào)用session_start()。session_start()函數(shù)的語法格式如下:

Bool session_start(void) //創(chuàng)建Session,開始一個會話,進(jìn)行Session初始化

注意:session_start()函數(shù)之前不能有任何輸出

當(dāng)?shù)谝淮卧L問網(wǎng)站時,Seesion_start()函數(shù)就會創(chuàng)建一個唯一的Session ID,并自動通過HTTP的響應(yīng)頭,將這個Session ID保存到客戶端Cookie中。同時,也在服務(wù)器端創(chuàng)建一個以Session ID命名的文件,用于保存這個用戶的會話信息。當(dāng)同一個用戶再次訪問這個網(wǎng)站時,也會自動通過HTTP的請求頭將Cookie中保存的Seesion ID再攜帶過來,這時Session_start()函數(shù)就不會再去分配一個新的Session ID,而是在服務(wù)器的硬盤中去尋找和這個Session ID同名的Session文件,將這之前為這個用戶保存的會話信息讀出,在當(dāng)前腳本中應(yīng)用,達(dá)到跟蹤這個用戶的目的。 Session以數(shù)組的形式使用,如:$_SESSION['session名']

注冊一個會話變量和讀取Session

在PHP中使用Session變量,除了要啟動之外,還要經(jīng)過注冊的過程。注冊和讀取Session變量,都要通過訪問$_SESSION數(shù)組完成。在$_SESSION關(guān)聯(lián)數(shù)組中的鍵名具有和PHP中普通變量相同的命名規(guī)則。注冊Session變量的代碼如下所示:

<?php//啟動session的初始化session_start();//注冊session變量,賦值為一個用戶的名稱$_SESSION["username"]="skygao";//注冊session變量,賦值為一個用戶的ID$_SESSION["uid"]=1;?>

執(zhí)行該腳本后,兩個Session變量就會被保存在服務(wù)器端的某個文件中,該文件的位置是通過php.ini文件,在session.save_path屬性指定的目錄下。

注銷變量與銷毀Session

當(dāng)使用完一個Session變量后,可以將其刪除,當(dāng)完成一個會話后,也可以將其銷毀。如果用戶退出Web系統(tǒng),就需要為他提供一個注銷的功能,把他的所有信息在服務(wù)器中銷毀。銷毀和當(dāng)前Session有關(guān)的所有的資料,可以調(diào)用session_destroy()函數(shù)結(jié)束當(dāng)前的會話,并清空會話中的所有資源。該函數(shù)的語法格式如下所示:

bool session_destroy(void) //銷毀和當(dāng)前Session有關(guān)的所有資料

該函數(shù)并不會釋放和當(dāng)前Session相關(guān)的變量,也不會刪除保存在客戶端Cookie中的SessionID。因?yàn)?_SESSION數(shù)組和自定義的數(shù)組在使用上是相同的,所以我們可以使用unset()函數(shù)來釋放在Session中注冊的單個變量。如下所示:

unset($_SESSION['鍵名']);

一定要注意,不要使用unset($_SESSION)刪除整個$_SESSION數(shù)組,這樣將不能再通過$_SESSION超全局?jǐn)?shù)組注冊變量了。但如果想把某個用戶在Session中注冊的所有變量都刪除,可以直接將數(shù)組變量$_SESSION賦上一個空數(shù)組。如下所示:

$_SESSION=array()

PHP默認(rèn)的Session是基于Cookie的,SessionID被服務(wù)器存儲在客戶端的Cookie中,所以在注銷Session時也需要清除Cookie中保存的SessionID,而這就必須借助setCookie()函數(shù)完成。在PHP腳本中,可以通過調(diào)用session_name()函數(shù)獲取Session名稱。刪除保存在客戶端Cookie中的SessionID,代碼如下所示:

<?php//判斷Cookie中是否存在session IDif(isset($_COOKIE[session_name()])){    //刪除包含Session ID的cookie,注意第四個參數(shù)一定要和php.ini設(shè)置的路徑相同    setcookie(session_name(),'',time()-3600,'/');}?>

通過前面的介紹可以總結(jié)出,Session的注銷過程共需要4個步驟。在下例中,提供完整的四個步驟代碼,運(yùn)行該腳本就可以關(guān)閉Session,并銷毀與本次會話有關(guān)的所有資源。代碼如下所示:

<?php//第一步:開啟Session并初始化session_start();//第二部:刪除所有Session的變量,也可以用unset($_SESSION[XXX])逐個刪除$_SESSION = array();//第三部:如果使用基于Cookie的session,使用setCookkie()刪除包含Session ID的cookieif(isset($_COOKIE[session_name()])) {    setCookie(session_name(), "", time()-42000, "/");}//第四部:最后徹底銷毀sessionsession_destroy();?>

session的phpini配置選項(xiàng)

php.ini文件和Session有關(guān)的幾個常用配置選項(xiàng):

session.auto_start = 0 ; 在請求啟動時初始化session

session.cache_expire = 180 ; 設(shè)置緩存中的會話文檔在 n 分鐘后過時

session.cookie_lifetime = 0 ; 設(shè)置按秒記的cookie的保存時間,相當(dāng)于設(shè)置Session的過期時間,為0時表示直到瀏覽器被重啟

session.auto_start=1,這樣就無需每次使用session之前都要調(diào)用session_start()不建議使用.但啟用該選項(xiàng)也有一些限制,如果確實(shí)啟用了 session.auto_start,則不能將對象放入會話中,因?yàn)轭惗x必須在啟動會話之前加載以在會話中重建對象。

session.cookie_path = / ; cookie的有效路徑session.cookie_domain = ; cookie的有效域session.name = PHPSESSID; 用在cookie里的session的名字session.save_handler = files ; 用于保存/取回數(shù)據(jù)的控制方式session.save_path = /tmp ; 在 save_handler 設(shè)為文件時傳給控制器的參數(shù), 這是數(shù)據(jù)文件將保存的路徑.session.use_cookies = 1 ; 是否使用cookies

Session的垃圾自動回收機(jī)制

可以通過session_destroy()函數(shù)在頁面中提供一個“退出”按鈕,通過單擊銷毀本次會話。但如果用戶沒有單擊退出按鈕,而是直接關(guān)閉瀏覽器,或斷網(wǎng)等情況,在服務(wù)器端保存的Session文件是不會刪除的。雖然關(guān)閉瀏覽器,下次需要重新分配一個新的Session ID重新登錄,但這只是因?yàn)樵趐hp.ini中的設(shè)置seesion.cookie_lifetime=0,來設(shè)定Session ID在客戶端Cookie中的有效限期,以秒為單位指定了發(fā)送到瀏覽器的Cookie的生命周期。當(dāng)系統(tǒng)賦予Session有效期限后不管瀏覽器是否開啟,Session ID都會自動消失。而客戶端Session ID消失服務(wù)器端保存的Session文件并沒有被刪除。所以沒有被Sessoin ID引用的服務(wù)器端Session文件,就成為了“垃圾”。

服務(wù)器保存的Session文件就是一個普通文本文件,所以都會有文件修改時間。“垃圾回收程序”啟動后就是根據(jù)Session文件的修改時間,將所有過期的Session文件全部刪除。通過在php.ini中設(shè)置session.gc_maxlifetime選項(xiàng)來指定一個時間(單位:秒),例如設(shè)置該選項(xiàng)值為1440(24分鐘)?!袄厥粘绦颉本蜁谒蠸ession文件中排查,如果有修改時間距離當(dāng)前系統(tǒng)時間大于1440秒的就將其刪除。

“session垃圾回收程序”是怎樣的啟動機(jī)制呢?“垃圾回收程序”是在調(diào)用session_start()函數(shù)時啟動的。而一個網(wǎng)站有多個腳本,沒有腳本又都要使用session_start()函數(shù)開啟會話,又會有很多個用戶同時訪問,這就很可能session_start()函數(shù)在1秒內(nèi)被調(diào)用N次,而如果每次都會啟動“session垃圾回收程序”,這樣是很不合理的??梢酝ㄟ^php.ini文件中修改“session.gc_probability和session.gc_divisor”兩個選項(xiàng),設(shè)置啟動垃圾回收程序的概率。會根據(jù)“session.gc_probability/session.gc_divisor”公示計算概率,例如選項(xiàng)session.gc_probability=1,而選項(xiàng)session.gc_divisor=100,這樣的概率就是“1/100”,即session_start()函數(shù)被調(diào)用100次才會有一次可能啟動“垃圾回收程序”。

關(guān)于“Session怎么使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Session怎么使用”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

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

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI