php中session使用方法詳解
來(lái)源:易賢網(wǎng) 閱讀:806 次 日期:2014-11-24 14:53:40
溫馨提示:易賢網(wǎng)小編為您整理了“php中session使用方法詳解”,方便廣大網(wǎng)友查閱!

session的聲明與使用

session的設(shè)置不同于cookie,必須先啟動(dòng),在php中必須調(diào)用session_start()。session_start()函數(shù)的語(yǔ)法格式如下:

bool session_start(void) //創(chuàng)建session,開(kāi)始一個(gè)會(huì)話,進(jìn)行session初始化

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

當(dāng)?shù)谝淮卧L問(wèn)網(wǎng)站時(shí),seesion_start()函數(shù)就會(huì)創(chuàng)建一個(gè)唯一的session id,并自動(dòng)通過(guò)http的響應(yīng)頭,將這個(gè)session id保存到客戶端cookie中。同時(shí),也在服務(wù)器端創(chuàng)建一個(gè)以session id命名的文件,用于保存這個(gè)用戶的會(huì)話信息。當(dāng)同一個(gè)用戶再次訪問(wèn)這個(gè)網(wǎng)站時(shí),也會(huì)自動(dòng)通過(guò)http的請(qǐng)求頭將cookie中保存的seesion id再攜帶過(guò)來(lái),這時(shí)session_start()函數(shù)就不會(huì)再去分配一個(gè)新的session id,而是在服務(wù)器的硬盤(pán)中去尋找和這個(gè)session id同名的session文件,將這之前為這個(gè)用戶保存的會(huì)話信息讀出,在當(dāng)前腳本中應(yīng)用,達(dá)到跟蹤這個(gè)用戶的目的。 session以數(shù)組的形式使用,如:$_session['session名']

注冊(cè)一個(gè)會(huì)話變量和讀取session

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

代碼如下:

<?php

//啟動(dòng)session的初始化

session_start();

//注冊(cè)session變量,賦值為一個(gè)用戶的名稱(chēng)

$_session[username]=skygao;

//注冊(cè)session變量,賦值為一個(gè)用戶的id

$_session[uid]=1;

?>

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

注銷(xiāo)變量與銷(xiāo)毀session

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

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

該函數(shù)并不會(huì)釋放和當(dāng)前session相關(guān)的變量,也不會(huì)刪除保存在客戶端cookie中的session

id。因?yàn)?_session數(shù)組和自定義的數(shù)組在使用上是相同的,所以我們可以使用unset()函數(shù)來(lái)釋放在session中注冊(cè)的單個(gè)變量。如下所示:

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

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

$_session=array()

php默認(rèn)的session是基于cookie的,session

id被服務(wù)器存儲(chǔ)在客戶端的cookie中,所以在注銷(xiāo)session時(shí)也需要清除cookie中保存的sessionid,而這就必須借助setcookie()函數(shù)完成。在php腳本中,可以通過(guò)調(diào)用session_name()函數(shù)獲取session名稱(chēng)。刪除保存在客戶端cookie中的session

id,代碼如下所示:

代碼如下:

<?php

//判斷cookie中是否存在session id

if(isset($_cookie[session_name()])){

//刪除包含session id的cookie,注意第四個(gè)參數(shù)一定要和php.ini設(shè)置的路徑相同

setcookie(session_name(),'',time()-3600,'/');

}

?>

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

代碼如下:

<?php

//第一步:開(kāi)啟session并初始化

session_start();

//第二部:刪除所有session的變量,也可以用unset($_session[xxx])逐個(gè)刪除

$_session = array();

//第三部:如果使用基于cookie的session,使用setcookkie()刪除包含session id的cookie

if(isset($_cookie[session_name()])) {

setcookie(session_name(), , time()-42000, /);

}

//第四部:最后徹底銷(xiāo)毀session

session_destroy();

?>

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

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

session.auto_start = 0 ; 在請(qǐng)求啟動(dòng)時(shí)初始化session

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

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

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

session.cookie_path = / ; cookie的有效路徑

session.cookie_domain = ; cookie的有效域

session.name = phpsessid; 用在cookie里的session的名字

session.save_handler = files ; 用于保存/取回?cái)?shù)據(jù)的控制方式

session.save_path = /tmp ; 在 save_handler 設(shè)為文件時(shí)傳給控制器的參數(shù), 這是數(shù)據(jù)文件將保存的路徑.

session.use_cookies = 1 ; 是否使用cookies

session的垃圾自動(dòng)回收機(jī)制

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

服務(wù)器保存的session文件就是一個(gè)普通文本文件,所以都會(huì)有文件修改時(shí)間?!袄厥粘绦颉眴?dòng)后就是根據(jù)session文件的修改時(shí)間,將所有過(guò)期的session文件全部刪除。通過(guò)在php.ini中設(shè)置session.gc_maxlifetime選項(xiàng)來(lái)指定一個(gè)時(shí)間(單位:秒),例如設(shè)置該選項(xiàng)值為1440(24分鐘)?!袄厥粘绦颉本蜁?huì)在所有session文件中排查,如果有修改時(shí)間距離當(dāng)前系統(tǒng)時(shí)間大于1440秒的就將其刪除。

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

php.ini中相關(guān)的配置

session.cookie_lifetime=0; 關(guān)閉瀏覽器相應(yīng)的cookie文件即被刪除

session.gc_maxlifetime; 設(shè)置過(guò)期session時(shí)間,默認(rèn)1440秒(24分鐘)

session.gc_probability/session.gc_divisor; 啟動(dòng)垃圾回收機(jī)制的概率(建議值為1/1000——5000)

cookie禁用時(shí)通過(guò)url傳遞session的id

使用session跟蹤一個(gè)用戶,是通過(guò)在各個(gè)頁(yè)面之間傳遞唯一的session id,并通過(guò)session id提取這個(gè)用戶在服務(wù)器中保存的session變量。常見(jiàn)的session id傳送方法有以下兩種。

第一種方法是基于cookie的方式傳遞session id,這種方式更優(yōu),但不總是可用, 因?yàn)橛脩粼诳蛻舳丝梢云帘蝐okie;

第二種方法是通過(guò)url參數(shù)進(jìn)行傳遞,直接將session id嵌入到url中去。

在session的實(shí)現(xiàn)中通常都是采用cookie的方式,客戶端保存的session id就是一個(gè)cookie。當(dāng)客戶禁用cookie時(shí),session id就不能在cookie中保存,也就不能在頁(yè)面之間傳遞,此時(shí)session失效。不過(guò)php5在linux平臺(tái)可以自動(dòng)檢查cookie狀態(tài),如果客戶端禁用它,則系統(tǒng)自動(dòng)把session id附加到url上傳送。而使用windows系統(tǒng)作為web服務(wù)器則無(wú)此功能。

在php中提出了跟蹤session的另一種機(jī)制,如果客戶瀏覽器不支持cookie,則php可以重寫(xiě)客戶請(qǐng)求的url,把session id添加到url信息中??梢允謩?dòng)地在每個(gè)超鏈接的url中都加上一個(gè)session id,但工作量比較大,不建議使用這種方法。如下所示:

代碼如下:

<?php

//開(kāi)啟session

session_start();

//在每個(gè)url后面附加上參數(shù),變量名為session_name()獲取名稱(chēng),值通過(guò)session_id()獲取

echo '<a href=demo.php?'.session_name().'='.session_id().'>連接演示</a>';

?>

在使用linux系統(tǒng)做服務(wù)器時(shí),則在編輯php時(shí)如果使用了–enable-trans-sid配置選項(xiàng),和運(yùn)行時(shí)選項(xiàng)session.use_trans_sid都被激活,在客戶端禁用cookie時(shí),相對(duì)url將被自動(dòng)修改為包含會(huì)話id。如果沒(méi)有這么配置,或者使用windows系統(tǒng)作為服務(wù)器時(shí),可以使用常量sid。該常量在會(huì)話啟動(dòng)時(shí)被定義,如果客戶端沒(méi)有發(fā)送適當(dāng)?shù)臅?huì)話cookie,則sid的格式為session_name=session_id,否則就為一個(gè)空字符串。因此可以無(wú)條件地將其嵌入到url中去。在下例中使用兩個(gè)腳本程序,演示了session id的傳送方法。

<?php

session_start();

$_session[username]=admin;

echo session id:.session_id().<br>;

?>

通過(guò)url傳遞session id

在腳本test2.php中,輸出test1.php腳本在session變量中保存的另一個(gè)用戶名。又在該頁(yè)面中輸出一次session id,通過(guò)對(duì)比判斷兩個(gè)腳本是否使用同一個(gè)session id。另外,在開(kāi)啟或關(guān)閉cookie時(shí),注意瀏覽器地址欄中url的變化。代碼如下所示:

代碼如下:

<?php

session_start();

echo $_session[username].< br>;

echo session id:.session_id().<br>;

?>

更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:php中session使用方法詳解
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)