php中的cookie和session

注意:Cookie是HTTP標頭的一部分,因此setCookie()函數必須在其他信息被輸出到瀏覽器前調用,所以即使是空格或空行,都不要在調用setCookie()函數之前輸出
1. cookie的設置有兩種方式:

  • 設置cookie變量
  • 設置cookie數組
    以下是代碼實例:
setcookie("mtg","mmm");
echo $_COOKIE["mtg"];//輸出mmm

setcookie("user[username]", "abcd");
setcookie("user[password]",md5("123456")); 
setcookie("user[email]", "[email protected]");

foreach($_COOKIE["user"] as $key => $value){
    echo $key.":".$value."</br>";
}
//輸出username:abcd
//password:e10adc3949ba59abbe56e057f20f883e
//email:[email protected]

2.刪除Cookie:有2種方式刪除Cookie:

  • setcookie()時,只輸入第一個參數,第二個參數相當於null
setcookie("mtg");
  • 設置cookie爲已過期
setcookie("mtg","",time()-1);

session

  原理:當第一次訪問網站時,Seesion_start()函數就會創建一個唯一的Session ID,並自動通過HTTP的響應頭,將這個Session ID保存到客戶端Cookie中。同時,也在服務器端創建一個以Session ID命名的文件,用於保存這個用戶的會話信息。當同一個用戶再次訪問這個網站時,也會自動通過HTTP的請求頭將Cookie中保存的Seesion ID再攜帶過來,這時Session_start()函數就不會再去分配一個新的Session ID,而是在服務器的硬盤中去尋找和這個Session ID同名的Session文件,將這之前爲這個用戶保存的會話信息讀出,在當前腳本中應用,達到跟蹤這個用戶的目的。 Session以數組的形式使用,如:$_SESSION[‘session名’]
  注意:session_start()函數之前不能有任何輸出
  
1. 執行以下代碼後,兩個Session變量就會被保存在服務器端的某個文件中,該文件的位置是通過php.ini文件,在session.save_path屬性指定的目錄下

session_start();
$_SESSION["mtg"]=123;
$_SESSION["mm"]=456;
var_dump($_SESSION);//輸出array(2) { ["mtg"]=> int(123) ["mm"]=> int(456) }

2.session_destroy()銷燬和當前Session有關的所有的資料,可以調用session_destroy()函數結束當前的會話,並清空會話中的所有資源。該函數並不會釋放和當前Session相關的變量,也不會刪除保存在客戶端Cookie中的Session ID
3. 銷燬存儲的session變量有兩種方式
- unset(SESSION[]);session _SESSION=array();銷燬全部的session變量
以下是實例代碼:

session_destroy();
var_dump($_SESSION); //輸出array(2) { ["mtg"]=> int(123)["mm"]=> int(456) }

unset($_SESSION['mtg']);
var_dump($_SESSION);//輸出array(1) { ["mm"]=> int(456) }

$_SESSION=array();
var_dump($_SESSION);//輸出array(0) { }

PHP默認的Session是基於Cookie的,Session
ID被服務器存儲在客戶端的Cookie中,所以在註銷Session時也需要清除Cookie中保存的SessionID,而這就必須藉助setCookie()函數完成。在PHP腳本中,可以通過調用session_name()函數獲取Session名稱。刪除保存在客戶端Cookie中的Session

var_dump($_COOKIE[session_name()]);//string(26)"olo16sl2urim2ou0c8o4221ck0"等價於session_id()

if(isset($_COOKIE[session_name()])){
    //刪除包含Session ID的cookie,注意第四個參數一定要和php.ini設置的路徑相同
    setcookie(session_name(),'',time()-3600,'/');

通過一上可以看出Session的註銷過程共需要4個步驟

<?php
//第一步:開啓Session並初始化
session_start();

//第二部:刪除所有Session的變量,也可以用unset($_SESSION[XXX])逐個刪除
$_SESSION = array();

//第三部:如果使用基於Cookie的session,使用setCookkie()刪除包含Session ID的cookie
if(isset($_COOKIE[session_name()])) {
    setCookie(session_name(), "", time()-42000, "/");
}

//第四部:最後徹底銷燬session
session_destroy();

php.ini中sesion的參數配置

session.auto_start = 0 ; 在請求啓動時初始化session
session.cache_expire = 180 ; 設置緩存中的會話文檔在 n 分鐘後過時
session.cookie_lifetime = 0 ; 設置按秒記的cookie的保存時間,相當於設置Session的過期時間,爲0時表示直到瀏覽器被重啓
session.auto_start=1,這樣就無需每次使用session之前都要調用session_start()不建議使用.但啓用該選項也有一些限制,如果確實啓用了 session.auto_start,則不能將對象放入會話中,因爲類定義必須在啓動會話之前加載以在會話中重建對象。
session.cookie_path = / ; cookie的有效路徑
session.cookie_domain = ; cookie的有效域
session.name = PHPSESSID; 用在cookie裏的session的名字
session.save_handler = files ; 用於保存/取回數據的控制方式
session.save_path = /tmp ; 在 save_handler 設爲文件時傳給控制器的參數, 這是數據文件將保存的路徑.
session.use_cookies = 1 ; 是否使用cookies
session的垃圾回收裝置:用戶可以通過session_destroy()函數在頁面中提供一個“退出”按鈕,通過單擊銷燬本次會話。銷燬服務器端的session,但如果用戶沒有單擊退出按鈕,而是直接關閉瀏覽器,或斷網等情況,在服務器端保存的Session文件是不會刪除的,垃圾回收程序”是在調用session_start()函數時啓動的垃圾回收程序,啓動後就是根據Session文件的修改時間,將所有過期的Session文件全部刪除。通過在php.ini中設置session.gc_maxlifetime選項來指定一個時間,例如設置該選項值爲1440(24分鐘)。“垃圾回收程序”就會在所有Session文件中排查,如果有修改時間距離當前系統時間大於1440秒的就將其刪除。可以通過php.ini文件中修改“session.gc_probability
session.gc_divisor”兩個選項,設置啓動垃圾回收程序的概率。會根據“session.gc_probability/session.gc_divisor”公示計算概率,例如選項session.gc_probability=1,而選項session.gc_divisor=100,這樣的概率就是“1/100”,即session_start()函數被調用100次纔會有一次可能啓動“垃圾回收程序”。

當cookie被禁用時:

  • 在使用Linux系統做服務器時,則在編輯PHP時如果使用了–enable-trans-sid配置選項,和運行時選項session.use_trans_sid都被激活,在客戶端禁用Cookie時,相對URL將被自動修改爲包含會話ID。
  • 如果沒有這麼配置,或者使用Windows系統作爲服務器時,可以使用常量SID。該常量在會話啓動時被定義,如果客戶端沒有發送適當的會話Cookie,則SID的格式爲session_name=session_id,否則就爲一個空字符串。因此可以無條件地將其嵌入到URL中去。在下例中使用兩個腳本程序,演示了Session ID的傳送方法。
    test1.php
<?php
session_start();

$_SESSION["username"]="admin";

echo "session ID:".session_id()."<br>";

?>

<a href="test2.php?<?php echo SID ?>">通過URL傳遞Session ID</a>
//

test2.php

<?php 
session_start();

echo $_SESSION["username"]."< br>";
echo "session ID:".session_id()."<br>";
?>

test1.php代碼輸出爲:session ID:bq8oiqhiqnpski4la09d008h14 通過URL傳遞Session ID,當點擊超鏈接後:admin< br>session ID:bq8oiqhiqnpski4la09d008h14,session ID傳遞成功

發佈了40 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章