亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

理解PHP中的Session及對(duì)Session有效期的控制

 更新時(shí)間:2016年01月08日 15:04:07   作者:傲雪星楓  
這篇文章主要介紹了理解PHP中的Session及對(duì)Session有效期的控制,Session默認(rèn)有效期為1440秒而后則會(huì)用到PHP的垃圾回收,需要的朋友可以參考下

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

1.php session 有效期

php的session有效期默認(rèn)是1440秒(24分鐘),如果客戶(hù)端超過(guò)24分鐘沒(méi)有刷新,當(dāng)前session會(huì)被回收,失效。
當(dāng)用戶(hù)關(guān)閉瀏覽器,會(huì)話結(jié)束,session也會(huì)失效。

可以修改php.ini的session.gc_maxlifetime來(lái)設(shè)置session的生命周期,但并不能保證在超過(guò)這一時(shí)間后session信息立即會(huì)刪除。因?yàn)镚C是按機(jī)率啟動(dòng)的,可能在某一個(gè)長(zhǎng)時(shí)間內(nèi)都沒(méi)有被啟動(dòng)。那么大量的session在超過(guò)session.gc_maxlifetime后仍然有效。


2.session.gc_maxlifetime,session.gc_probability,session.gc_divisor說(shuō)明

session.gc_maxlifetime = 30 表示當(dāng)session文件在30秒后沒(méi)有被訪問(wèn),則視為過(guò)期session,等待GC回收。

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

把session.gc_probability/session.gc_divisor的機(jī)率提高,會(huì)有幫助,但會(huì)對(duì)性能造成嚴(yán)重影響。


3.嚴(yán)格控制session過(guò)期方法

(1).使用memcache/redis來(lái)保存session,設(shè)置過(guò)期時(shí)間,因?yàn)閙emcache/redis的回收機(jī)制不是按機(jī)率的,可以確保session過(guò)期后失效。

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

<?php
/**
 * Session控制類(lèi)
 */
class Session{

  /**
   * 設(shè)置session
   * @param String $name  session name
   * @param Mixed $data  session data
   * @param Int  $expire 超時(shí)時(shí)間(秒)
   */
  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'); // 未過(guò)期,輸出
sleep(10);
echo session::get('test'); // 已過(guò)期
?>

相關(guān)文章

最新評(píng)論