php中關於Session的使用詳解

來源:互聯網
上載者:User
在學習php過程中會遇到緩衝問題,本文將詳解其相關內容。

Session的聲明與使用

Session的設定不同於Cookie,必須先啟動,在PHP中必須調用session_start()。session_start()函數的文法格式如下:

Bool session_start(void) //建立Session,開始一個會話,進行Session初始化

注意:session_start()函數之前不能有任何輸出

當第一次訪問網站時,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

在PHP中使用Session變數,除了要啟動之外,還要經過註冊的過程。註冊和讀取Session變數,都要通過訪問$_SESSION數組完成。在$_SESSION關聯陣列中的鍵名具有和PHP中普通變數相同的命名規則。註冊Session變數的代碼如下所示:

代碼如下

//啟動session的初始化session_start();//註冊session變數,賦值為一個使用者的名稱$_SESSION["username"]="skygao";//註冊session變數,賦值為一個使用者的ID$_SESSION["uid"]=1;>

執行該指令碼後,兩個Session變數就會被儲存在伺服器端的某個檔案中,該檔案的位置是通過php.ini檔案,在session.save_path屬性指定的目錄下。

登出變數與銷毀Session

當使用完一個Session變數後,可以將其刪除,當完成一個會話後,也可以將其銷毀。如果使用者退出Web系統,就需要為他提供一個登出的功能,把他的所有資訊在伺服器中銷毀。銷毀和當前Session有關的所有的資料,可以調用session_destroy()函數結束當前的會話,並清空會話中的所有資源。該函數的文法格式如下所示:

bool session_destroy(void) //銷毀和當前Session有關的所有資料

該函數並不會釋放和當前Session相關的變數,也不會刪除儲存在用戶端Cookie中的Session

ID。因為$_SESSION數組和自訂的數組在使用上是相同的,所以我們可以使用unset()函數來釋放在Session中註冊的單個變數。如下所示:

unset($_SESSION['鍵名']);

一定要注意,不要使用unset($_SESSION)刪除整個$_SESSION數組,這樣將不能再通過$_SESSION超全域數組註冊變數了。但如果想把某個使用者在Session中註冊的所有變數都刪除,可以直接將陣列變數$_SESSION賦上一個空數組。如下所示:

$_SESSION=array()

PHP預設的Session是基於Cookie的,Session

ID被伺服器儲存在用戶端的Cookie中,所以在登出Session時也需要清除Cookie中儲存的SessionID,而這就必須藉助setCookie()函數完成。在PHP指令碼中,可以通過調用session_name()函數擷取Session名稱。刪除儲存在用戶端Cookie中的Session

ID,代碼如下所示:

代碼如下

//判斷Cookie中是否存在session ID

if(isset($_COOKIE[session_name()])){

//刪除包含Session ID的cookie,注意第四個參數一定要和php.ini設定的路徑相同

setcookie(session_name(),'',time()-3600,'/');

}

>

通過前面的介紹可以總結出,Session的登出過程共需要4個步驟。在下例中,提供完整的四個步驟代碼,運行該指令碼就可以關閉Session,並銷毀與本次會話有關的所有資源。代碼如下所示:

代碼如下

//第一步:開啟Session並初始化session_start();//第二部:刪除所有Session的變數,也可以用unset($_SESSION[XXX])逐個刪除$_SESSION = array();//第三部:如果使用基於Cookie的session,使用setCookkie()刪除包含Session ID的cookieif(isset($_COOKIE[session_name()])) {setCookie(session_name(), "", time()-42000, "/");}

//第四部:最後徹底銷毀session

session_destroy();>session的phpini配置選項php.ini檔案和Session有關的幾個常用配置選項:session.auto_start = 0 ; 在請求啟動時初始化sessionsession.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 ID重新登入,但這隻是因為在php.ini中的設定seesion.cookie_lifetime=0,來設定Session ID在用戶端Cookie中的有效限期,以秒為單位指定了發送到瀏覽器的Cookie的生命週期。當系統賦予Session有效期間限後不管瀏覽器是否開啟,Session ID都會自動消失。而用戶端Session ID消失伺服器端儲存的Session檔案並沒有被刪除。所以沒有被Sessoin ID引用的伺服器端Session檔案,就成為了“垃圾”。

伺服器儲存的Session檔案就是一個普通文字檔,所以都會有檔案修改時間。“記憶體回收程式”啟動後就是根據Session檔案的修改時間,將所有到期的Session檔案全部刪除。通過在php.ini中設定session.gc_maxlifetime選項來指定一個時間(單位:秒),例如設定該選項值為1440(24分鐘)。“記憶體回收程式”就會在所有Session檔案中排查,如果有修改時間距離當前系統時間大於1440秒的就將其刪除。

“session記憶體回收程式”是怎樣的啟動機制呢“記憶體回收程式”是在調用session_start()函數時啟動的。而一個網站有多個指令碼,沒有指令碼又都要使用session_start()函數開啟會話,又會有很多個使用者同時訪問,這就很可能session_start()函數在1秒內被調用N次,而如果每次都會啟動“session記憶體回收程式”,這樣是很不合理的。可以通過php.ini檔案中修改“session.gc_probability和session.gc_pisor”兩個選項,設定啟動記憶體回收程式的機率。會根據“session.gc_probability/session.gc_pisor”公示計算機率,例如選項session.gc_probability=1,而選項session.gc_pisor=100,這樣的機率就是“1/100”,即session_start()函數被調用100次才會有一次可能啟動“記憶體回收程式”。

php.ini中相關的配置

session.cookie_lifetime=0; 關閉瀏覽器相應的cookie檔案即被刪除session.gc_maxlifetime; 設定到期session時間,預設1440秒(24分鐘)session.gc_probability/session.gc_pisor; 啟動記憶體回收機制的機率(建議值為1/1000——5000)

cookie禁用時通過URL傳遞session的ID

使用Session跟蹤一個使用者,是通過在各個頁面之間傳遞唯一的Session ID,並通過Session ID提取這個使用者在伺服器中儲存的Session變數。常見的Session ID傳送方法有以下兩種。

第一種方法是基於cookie的方式傳遞session ID,這種方式更優,但不總是可用, 因為使用者在用戶端可以屏蔽cokie;

第二種方法是通過url參數進行傳遞,直接將session ID嵌入到URL中去。

在Session的實現中通常都是採用Cookie的方式,用戶端儲存的Session ID就是一個Cookie。當客戶禁用Cookie時,Session ID就不能在Cookie中儲存,也就不能在頁面之間傳遞,此時Session失效。不過PHP5在Linux平台可以自動檢查Cookie狀態,如果用戶端禁用它,則系統自動把Session ID附加到URL上傳送。而使用Windows系統作為Web伺服器則無此功能。

在PHP中提出了跟蹤Session的另一種機制,如果客戶瀏覽器不支援Cookie,則PHP可以重寫客戶請求的URL,把Session ID添加到URL資訊中。可以手動地在每個超連結的URL中都加上一個Session ID,但工作量比較大,不建議使用這種方法。如下所示:

代碼如下

//開啟session

session_start();

//在每個URL後面附加上參數,變數名為session_name()擷取名稱,值通過session_id()擷取

echo '串連示範';

>

在使用Linux系統做伺服器時,則在編輯PHP時如果使用了–enable-trans-sid配置選項,和運行時選項session.use_trans_sid都被啟用,在用戶端禁用Cookie時,相對URL將被自動修改為包含會話ID。如果沒有這麼配置,或者使用Windows系統作為伺服器時,可以使用常量SID。該常量在會話啟動時被定義,如果用戶端沒有發送適當的會話Cookie,則SID的格式為session_name=session_id,否則就為一個Null 字元串。因此可以無條件地將其嵌入到URL中去。在下例中使用兩個指令碼程式,示範了Session ID的傳送方法。

session_start();$_SESSION["username"]="admin";echo "session ID:".session_id()."";

本篇詳解了session的相關問題,更多相關知識請關注php中文網。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.