1. 程式人生 > >理解PHP中的會話控制

理解PHP中的會話控制

www. 只需要 通過 提交 http post col 現在 參數的傳遞 文件中

會話控制是一種跟蹤用戶的通信方式,使用會話控制主要基於以下幾點:由於http協議的無狀態性,使得不能通過協議來建立兩次請求之間的關聯;對於通常的頁面之間的數據傳遞方式get和post而言,主要處理參數的傳遞、資料的輸入兩個頁面間簡單的數據傳遞,對於一個用戶的在網站上的多個頁面,多種不同的數據,可能還有權限的不同而導致頁面的不同、操作方式的不同等等,使用get和post非常繁瑣。

1.cookie方式

為了對用戶進行跟蹤,就必須對用戶進行標記,cookie的思想就是,當用戶訪問網站的第一個頁面時,通過設置用戶的信息標識,web服務器將其以文本文件的形式存放到用戶的電腦上面,這些文件就是所謂的cookie,以鍵值對的方式存儲,當用戶再訪問第二個該網站的頁面時,將通過http頭信息,將攜帶cookie文件中的信息一起訪問服務器,並重新對剛才的用戶信息進行驗證,這樣避免了每次訪問都輸入用戶信息,可以確定多個頁面之間的訪問是不是同一用戶了。

將信息設置到cookie的函數:setcookie($key, $value, $expire, $path, $domain, $secure)。

參數依次是:鍵、值、過期時間(UNIX時間戳,默認為0表示關閉瀏覽器則cookie消失)、存取cookie的路徑,設定後服務器上該路徑下的腳本可存取cookie(默認為根目錄)、存取cookie的域名,只有該域名(比如www.example.com)下的網站網頁可存取cookie、是否是https安全連接才啟用cookie。

比如通過post提交表單後記錄一些信息

<?php
    if(isset($_POST)){
        $time = time();
        setcookie(‘user‘, $_POST[‘user‘], $time+3600);  // 時間參數需要比當前時間點大,以表示cookie信息的有效時間
        setcookie(‘data‘, array(1,2,3), $time+1200);  // 可以存放各種數據 
    }


保存cookie成功後,可直接到$_COOKIE超全局數組中以鍵名取得該值,非常方便,如echo $_COOKIE[‘user‘],基本的數據類型都支持

cookie的刪除仍是通過setcookie進行,最好寫成將時間提前的形式,或者直接寫一個鍵名,比如在用戶點擊退出時進行該項操作

   setcookie(‘user‘, ‘‘, time()-200);  // 時間提前,相對當前時間
    setcookie(‘user‘);  // 簡寫,只寫鍵名

2.session方式

session與cookie相似,只是原來將信息存在用戶端的,現在改為存到服務端,但在用戶端產生一個標識id,這個id默認是保存到用戶本地的cookie中,所以session又和cookie扯上了關系。這樣用戶第一次訪問時將信息存到web服務器,並隨機分配給用戶一個固定長度的字符串(session id),以後用戶再訪問其他頁面,就帶著這個id去服務端裏找對應用戶數據信息,於是就可以跟蹤用戶了,使用cookie的session稱為基於cookie的session。


但是用戶可以將瀏覽器設為禁用cookie(雖一般不會這麽做),有的網站在檢測到禁用cookie後會強制讓用戶去開啟,但卻是存在這麽一種情況,如此一來通過基於cookie的方式行不通了,這時就可以通過在URL後附帶一個session id的get形式傳遞了,當然也可以通過http post。


session的使用


首先,要用session_start()開啟一個會話。註意對於這類網絡函數,在它前面不準有輸出,哪怕是<?php標識符前面有空格也不行(必須有輸出可以用ob_start()控制,先輸出到緩存 )。(註意,有時單獨一句session_start()會報警告,後面會談到)


然後,註冊會話變量,也就是存取用戶信息或有用的數據,不需要使用什麽函數,直接存入$_SESSION超全局數組,比如$_SESSION[‘user‘] = $_POST[[‘user‘],這些數據將被保存到服務端的某個文件中,當然也可能是緩存(memcache、redis)中。


當跳轉到其他頁面時,在其他頁面也要先開啟這個會話,依然是session_start(),如果會話已經開啟,該函數返回當前會話,如果沒有則重新開啟。


最後,用戶退出或某些原因銷毀對話,要註銷這些變量。分四步走:


1.仍然是先開啟會話,或者是跳轉到其他頁面時,再次返回已經存在的會話,需要確保前面沒有輸出


    session_start();   // 開啟或返回一個會話
 2.清空$_SESSION數組中的相關變量
  unset($_SESSION[‘robert‘])  // 銷毀某一個變量
  $_SESSION = array();  // 或者一次性全部銷毀會話變量
 3.清除保存在客戶端的cookie,別忘了session id還在用戶計算機上面
 if(isset($_COOKIE[session_name()])){
        unset($_COOKIE[session_name()]);    // session_name()獲取sesion的名,session id也是以名和值的形式存儲的
    }

4.徹底銷毀存儲到服務器的信息
  session_destroy();

四步走完,就結束了一次session會話。

3.使用會話控制的基本步驟如下:

  1)開始一個會話

    調用session_start()函數即可,函數的具體功能可以查閱PHP的文檔。需要註意的是,必須在使用會話的腳本開始部分調用這個函數,如果沒有,所有保存在該會話中的信息都無法在腳本中使用。除了手動調用session_start()函數外,也可以自動配置PHP自動調用,可以Google之。

  2)註冊一個會話變量

    從PHP4.1以後,會話變量保存在超級全局數組$_SESSION中。要創建一會話變量,只需要在數組中設置一個元素,如$_SESSION[‘myvar‘] = 5;

  3) 使用一個會話變量

    要使用一個會話變量很簡單,使用$_SESSION數組訪問保存的會話變量即可,如 echo $_SESSION[‘mywar‘]; 會打印出 5。使用會話前必須首先使用session_start()函數啟動一個會話。

  4)註銷變量和銷毀會話

    註銷變量直接使用unset即可,如unset($_SESSION[‘myvar‘]),如何要一次銷毀所有會話變量,可以使用 unset($_SESSION); 當使用完一個會話後,首先應該註銷所有的變量,然後再調用session_destroy() 來清除會話ID。

 
 
 

理解PHP中的會話控制