溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中Session及對Session有效期控制的示例分析

發(fā)布時間:2021-08-31 13:56:26 來源:億速云 閱讀:98 作者:小新 欄目:開發(fā)技術

這篇文章主要為大家展示了“PHP中Session及對Session有效期控制的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“PHP中Session及對Session有效期控制的示例分析”這篇文章吧。

0.什么是session?
       Session的中文譯名叫做“會話”,其本來的含義是指有始有終的一系列動作/消息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之為一個session。目前社會上對session的理解非?;靵y:有時候我們可以看到這樣的話“在一個瀏覽器會話期間,...”,這里的會話是指從一個瀏覽器窗口打開到關閉這個期間;也可以看到“用戶(客戶端)在一次會話期間”這樣一句話,它可能指用戶的一系列動作(一般情況下是同某個具體目的相關的一系列動作,比如從登錄到選購商品到結賬登出這樣一個網(wǎng)上購物的過程;然而有時候也可能僅僅是指一次連接;其中的差別只能靠上下文來推斷了。
       然而當session一詞與網(wǎng)絡協(xié)議相關聯(lián)時,它又往往隱含了“面向連接”和/或“保持狀態(tài)”這樣兩個含義,“面向連接”指的是在通信雙方在通信之前要先建立一個通信的渠道,比如打電話,直到對方接了電話通信才能開始?!氨3譅顟B(tài)”則是指通信的一方能夠把一系列的消息關聯(lián)起來,使得消息之間可以互相依賴,比如一個服務員能夠認出再次光臨的老顧客并且記得上次這個顧客還欠店里一塊錢。這一類的例子有“一個TCP session”或者“一個POP3 session”。
       鑒于這種混亂已不可改變,要為session下個定義就很難有統(tǒng)一的標準。而在閱讀session相關資料時,我們也只有靠上下文來推斷理解了。不過我們可以這樣理解:例如我們打電話,從撥通的那一刻起到掛斷電話期間,因為電話一直保持著接通的狀態(tài),所以把這種接通的狀態(tài)叫做session。它是訪客與整個網(wǎng)站交互過程中一直存在的公有變量,在客戶端不支持COOKIE的時候,為了保證數(shù)據(jù)正確、安全,就采用SESSION變量。訪問網(wǎng)站的來客會被分配一個唯一的標識符,即所謂的會話 ID。它要么存放在客戶端的 cookie,要么經(jīng)由 URL 傳遞。
       SESSION的發(fā)明填補了HTTP協(xié)議的局限:HTTP協(xié)議被認為是無狀態(tài)協(xié)議,無法得知用戶的瀏覽狀態(tài),當它在服務端完成響應之后,服務器就失去了與該瀏覽器的聯(lián)系。這與HTTP協(xié)議本來的目的是相符的,客戶端只需要簡單的向服務器請求下載某些文件,無論是客戶端還是服務器都沒有必要紀錄彼此過去的行為,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關系一樣。
       因此通過SESSION(cookie是另外一種解決辦法)記錄用戶的有關信息,以供用戶再次以此身份對web服務器提起請求時作確認。會話的發(fā)明使得一個用戶在多個頁面間切換時能夠保存他的信息。網(wǎng)站編程人員都有這樣的體會,每一頁中的變量是不能在下一頁中使用的(雖然form,url也可以實現(xiàn),但這都是非常不理想的辦法),而SESSION中注冊的變量就可以作為全局變量使用了。
       那么SESSION到底有什么用處呢?網(wǎng)上購物時大家都用過購物車,你可以隨時把你選購的商品加入到購物車中,最后再去收銀臺結帳。在整個過程中購物車一直扮演著臨時存貯被選商品的角色,用它追蹤用戶在網(wǎng)站上的活動情況,這就是SESSION的作用,它可以用于用戶身份認證,程序狀態(tài)記錄,頁面之間參數(shù)傳遞等。
       SESSION 的實現(xiàn)中采用COOKIE技術,SESSION會在客戶端保存一個包含session_id(SESSION編號)的COOKIE;在服務器端保存其他 session變量,比如session_name等等。當用戶請求服務器時也把session_id一起發(fā)送到服務器,通過session_id提取所保存在服務器端的變量,就能識別用戶是誰了。同時也不難理解為什么SESSION有時會失效了。
       當客戶端禁用COOKIE時(點擊IE中的“工具”—“internet="">Internet選項”,在彈出的對話框里點擊“安全”—“自定義級別”項,將“允許每個對話COOKIE”設為禁用),session_id將無法傳遞,此時SESSION失效。不過php5在linux/unix平臺可以自動檢查cookie狀態(tài),如果客戶端設置了禁用,則系統(tǒng)自動把session_id附加到url上傳遞。windows主機則無此功能。    

1.php session 有效期

php的session有效期默認是1440秒(24分鐘),如果客戶端超過24分鐘沒有刷新,當前session會被回收,失效。
當用戶關閉瀏覽器,會話結束,session也會失效。

可以修改php.ini的session.gc_maxlifetime來設置session的生命周期,但并不能保證在超過這一時間后session信息立即會刪除。因為GC是按機率啟動的,可能在某一個長時間內(nèi)都沒有被啟動。那么大量的session在超過session.gc_maxlifetime后仍然有效。

2.session.gc_maxlifetime,session.gc_probability,session.gc_divisor說明

session.gc_maxlifetime = 30 表示當session文件在30秒后沒有被訪問,則視為過期session,等待GC回收。

GC進程調(diào)用的概率是通過session.gc_probability/session.gc_divisor計算得來的,而session.gc_divisor默認是1000,
如果session.gc_probability = 1000,那么GC進程在每次執(zhí)行session_start()時都會調(diào)用,執(zhí)行回收。

把session.gc_probability/session.gc_divisor的機率提高,會有幫助,但會對性能造成嚴重影響。

3.嚴格控制session過期方法

(1).使用memcache/redis來保存session,設置過期時間,因為memcache/redis的回收機制不是按機率的,可以確保session過期后失效。

(2).只使用php實現(xiàn),創(chuàng)建一個session類,在session寫入時,把過期時間也寫入。讀取時,根據(jù)過期時間判斷是否已過期。

<?php
/**
 * Session控制類
 */
class Session{

  /**
   * 設置session
   * @param String $name  session name
   * @param Mixed $data  session data
   * @param Int  $expire 超時時間(秒)
   */
  public static function set($name, $data, $expire=600){
    $session_data = array();
    $session_data['data'] = $data;
    $session_data['expire'] = time()+$expire;
    $_SESSION[$name] = $session_data;
  }

  /**
   * 讀取session
   * @param String $name session name
   * @return Mixed
   */
  public static function get($name){
    if(isset($_SESSION[$name])){
      if($_SESSION[$name]['expire']>time()){
        return $_SESSION[$name]['data'];
      }else{
        self::clear($name);
      }
    }
    return false;
  }

  /**
   * 清除session
   * @param String $name session name
   */
  private static function clear($name){
    unset($_SESSION[$name]);
  }

}
?>

demo:

<?php
session_start();

$data = '123456';
session::set('test', $data, 10);
echo session::get('test'); // 未過期,輸出
sleep(10);
echo session::get('test'); // 已過期
?>

以上是“PHP中Session及對Session有效期控制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI