Cookie和SESSION是數據的臨時檔案館。
Cookie將數據存儲在客戶端,實現數據的持久存儲。
SESSION將數據存儲在服務器端,保證數據在程序的單次訪問中持續有效。
有了Cookie和SESSION這個臨時檔案館,就可以解決HTTP Web協議的無狀態問題,實現數據在不同頁面之間的傳遞(如通過SESSION存儲的數據來判斷用戶的訪問權限)和數據在客戶端的持久存儲(如通過Cookie存儲論壇用戶的登錄信息,實現用戶下次在本機登錄時,不需要輸入用戶名和密碼,可以直接登錄)。對於Web網站的開發,這是兩項至關重要的內容,是學習者必須掌握的知識。
一、SESSION會話
session是指一個終端用戶與交互系統進行通信的時間間隔,通常指從註冊進入系統到註銷退出系統之間所經歷的時間。當登錄網站時,啓動session會話,在服務器中隨機生成一個唯一的SESSION_ID,這個SESSION_ID在本次登錄結束之前在頁面中一直有效。當關閉頁面或者執行註銷操作後,該SESSION_ID會在服務器中自動註銷。當重新登錄此頁面時,會再次生成一個隨機且唯一的SESSION_ID。
1.創建會話:4個步驟
(1)啓動會話
啓動PHP會話有兩種方式:
- 通過session_start()函數創建會話。
//在使用session_start()函數之前瀏覽器不能有任何輸出,否則會產生錯誤。即使在PHP腳本之外存在空格也不可以。bool session_start(void)
- 通過session_register()函數爲會話登錄一個變量來隱含地啓動會話。
//name用於指定新session變量的名稱。使用session_register()函數,要求將php.ini文件中的register_globals選項值設置爲On。在PHP5.3.0或者更高版本中不要使用session_register()函數來啓動會話,會出現錯誤。boolean session_register(string name)
- PHP會話的啓動,推薦應用session_start()。
(2)註冊會話
會話變量被啓動後,全部保存在數組$_SESSION中。通過數組$_SESSION創建一個會話變量很容易,只要直接給該數組添加一個元素即可。
(3)使用會話
例如,判斷頁面中是否存在會話ID,如果不存在,就創建一個,並且使其能夠通過全局數組$_SESSION進行訪問;如果已存在,則將這個已註冊的會話變量載入以供用戶使用。代碼如下:
<?php
session_start();
if(isset(session_id())){
echo $_SESSION['mr'];
}else{
$_SESSION['mr']="mrsoft";
}
?>
(4)刪除會話
有3種方式,即刪除單個會話、刪除多個會話、結束當前會話。
- 刪除單個會話:同刪除數組中的指定元素相同,都可以通過unset()函數完成。 unset($_SESSION['user']); 如果通過unset()函數一次註銷整個數組( unset($_SESSION) ),那麼會禁止整個會話功能,而且沒有辦法將其恢復,用戶也不能再註冊$_SESSION變量。
- 刪除多個會話:如果要一次註銷所有的會話變量,可以將一個空的數組賦值給$_SESSION。代碼如下:
$_SESSION = array();
該函數清空會話中的所有資源,徹底銷燬SESSION。</pre></li><li>結束當前會話:如果整個會話已結束,那麼就可以使用session_destroy()函數結束當前的會話。<pre class="html" name="code">session_destroy();
2、配置PHP的會話
在論壇中經常會看到對用戶登錄時間進行設置的複選框,該功能將您本次登錄使用的用戶名和密碼保存在本機中,具體保存時間由用戶自己選擇,如保存一個星期、一個月等。
(1)在客戶端支持Cookie的前提下,控制SESSION的生命週期
setCookie()函數
在PHP中,setCookie()函數的主要職責是創建Cookie。但是,該函數同樣可以控制SESSION的過期時間。實例如下:
<?php
session_start();
$time=1*60; //設置SESSION過期時間
setCookie(session_name(),session_id(),time()+$time,"/"); //設置SESSION過期時間
$_SESSION[id]="明日科技"; //註冊SESSION
?>
(2)在客戶端不支持Cookie的前提下,控制SESSION的生命週期
- 在登錄之前告知用戶必須打開Cookie,最爲常用。
- 設置php.ini文件中的session.use_trans_sid=1或者編譯時打開-enable-trans-sid選項,讓PHP自動跨頁面傳遞SESSION_ID。該方法基本不用。
- 以GET或者POST方式,通過表單元素傳遞SESSION_ID。
- 通過文件或者數據庫傳遞SESSION_ID。該方法修改SESSION數據的存儲位置,可以減輕服務器的壓力,特別適合於企業級網站開發使用。
3、SESSION臨時文件
session_save_path()函數用來取得或者重新配置當前SESSION的存儲路徑。
string session_save_path(string path)
//如果不設置path,則直接獲取當前SESSION的存儲路徑。
session_save_path()需在session_start()之前調用。
4、SESSION緩存
將網頁中的內容臨時存儲到客戶端IE的Temporary Internet Files文件夾下,並可以設置緩存的時間。
(1)緩存函數:session_cache_limiter
string session_cache_limiter([string cache_limiter])
//cache_limiter設置緩存方式:nocache,private,private nocache,public
(2)緩存時間函數:session_cache_expire
int session_cache_expire([int new_cache_expire])
//cache_expire設置SESSION的過期時間,單位爲分鐘。默認過期時間是180分鐘
session_cache_limiter()和session_cache_expire()必須在session_start()調用之前使用,否則將出錯。
注意:雖然通過緩存時間函數設置緩存過期時間,但是在過期之後並不能夠刪除存儲在客戶端緩存文件夾中的緩存文件,緩存文件的刪除由Windows操作系統自行控制,或者由用戶手動刪除。
5、SESSION數據庫存儲
將SESSION_ID存儲於數據庫中,應用session_set_handler()函數。具體參考手冊。