php中關於會話機制的理解

post200發表於2021-09-09

       web伺服器端與客戶端瀏覽器進行通訊時,是基於http協議的.但是http協議是無狀態協議,所謂無狀態是說本次的http請求與下一次請求是單獨的請求,每次請求儲存的資訊都不會儲存.因此會話機制就應運而生,這種機制就是解決這種問題.透過會話機制可以保留通訊資訊,比如使用者的資訊儲存,因此也實現了使用者在使用應用過程中的跟蹤,狀態的維護.


    cookie:
     cookie機制,是可以將訪問產生的一段資訊儲存在客戶端瀏覽器,進行下一次訪問的時候,會將該資訊帶入請求頭資訊中,將資訊
     傳遞到伺服器,從而實現web應用對使用者的資訊跟蹤與維護.

     cookie的設定方式:   setcookie(name,value,expire);    //name:cookie名稱,  value:cookie值,   expire:cookie的過期時間
             當expire過時間設定為0時,瀏覽器關閉,就會刪除cookie

     對cookie資訊的獲取:   $_COOKIE["name"];

     對cookie資訊的修改:   $_COOKIE["name"] = value;


     刪除cookie的兩種方式:   
    1> setcookie(name);  //直接刪除cookie

    2> setcookie(name,value,time()-100);    //設定cookie的過期時間小於當前時間
    




    session:
    session機制,同樣能實現儲存使用者資訊和維持請求狀態.但是與cookie不同的是,session將儲存的資訊存放在,web伺服器.預設是存放在檔案中,在php.ini配置檔案中,配置session.save_path可以將session產生的檔案存放在該位置,但是需要注意的是,該檔案路勁需要httpd程式的寫許可權比如apache的寫許可權,否則無法儲存session資料.當指定的目錄不存在時,伺服器不會自動建立,而 是需要手動建立.  session機制在預設情況下,是基於cookie的.也就是說.在使用session_start();初始化時,web伺服器會為訪問者自動生成一個sessionID 來唯一標識使用者,並且將該ID儲存在客戶端瀏覽器,以cookie機制來儲存,該cookie名稱為固定的,預設在php配置檔案中session.name配置,值為PHPSESSID.該cookie的值是自動生成的,但是在php中可以使用session_id()獲取在瀏覽器儲存的cookie值和session_name()獲取在瀏覽器儲存的cookie名稱.

      而在使用過程中儲存的資訊,會存放在伺服器配置的檔案路勁下並且以sess_為字首,以session_id為結尾命名,比如session id為vp8lfqnskjvsiilcp1c4l484d3,那麼session檔名就是sess_vp8lfqnskjvsiilcp1c4l484d3,但是session不僅僅只能基於cookie,因為瀏覽器可以禁用cookie,如果瀏覽器禁用後,客戶端就不能儲存該cookie資訊,從而影響session的使用.
        假如瀏覽器禁用cookie後,我們可以使用下面的途徑解決該問題:
    1、設定php.ini中的session.use_trans_sid = 1,當客戶端的Cookie被禁用或出現問題時,PHP會自動 把session id附著在URL中,
       這樣再透過session id就能跨頁使用session變數了
    2、手動透過URL傳值、隱藏表單傳遞session id。
    3、用檔案、資料庫等形式儲存session_id,在跨頁過程中手動呼叫。


     但是瀏覽器基本上都不會禁用cookie,因為禁用之後,瀏覽器訪問其他應用時都會出現問題.



     設定使用session的方式:
    session_start(); //初始化session

    $_SESSION['name'] = value;    // name:要設定的session名稱,  value:要設定的session名稱對應的值

    $_SESSION['name'];        // 獲取名稱為name的session值

     session資訊的刪除方式:
    需要刪除三個地方儲存的資料,但是首先需要初始化session   session_start():
    1步: 刪除客戶端瀏覽器儲存的cookie資訊
        setcookie(session_name(),session_id(),time()-100); 或者   setcookie(session_name());

 
    2步: 清空session全域性變數
        $_SESSION = array();    或者    session_unset();

    3步: 刪除session檔案
        session_destroy();





 總結:
    cookie:透過瀏覽器第一次訪問web應用時透過web伺服器呼叫設定cookie的相關函式比如setcookie(),告訴客戶端瀏覽器設定cookie
     資訊,在進行下一次請求web伺服器應用時,瀏覽器就會將儲存的使用者資訊,傳送給web伺服器.從而實現跨頁面獲取使用者資訊.因此也可以說
     使用者資訊是維護在客戶端瀏覽器的.

        session: 在客戶端訪問伺服器時,透過session_start()為客戶端分配一個sessionID標識.並且將使用者資訊儲存在客戶端檔案.當使用者
     下次訪問web伺服器的其他頁面時,瀏覽器會將分配的sessionID以cookie形式串入伺服器,伺服器獲取具有該sessionID標識的檔案,從而
     獲取到對應的使用者資訊.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2249/viewspace-2801490/,如需轉載,請註明出處,否則將追究法律責任。

相關文章