程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 再探PHP session

再探PHP session

編輯:關於PHP編程

轉載請注明來自souldak,微博:@evagle

以前對session和cookie其實還是模模糊糊的,今天用yii框架的時候遇到 session_regenerate_id(): Session object destruction failed這個錯誤,所以又看了看session的工作機理。


從W3Cschool中截取session的定義:

當您運行一個應用程序時,您會打開它,做些更改,然後關閉它。這很像一次會話。計算機清楚你是誰。它知道你何時啟動應用程序,並在何時終止。但是在因特網上,存在一個問題:服務器不知道你是誰以及你做什麼,這是由於 HTTP 地址不能維持狀態。

通過在服務器上存儲用戶信息以便隨後使用,PHP session 解決了這個問題(比如用戶名稱、購買商品等)。不過,會話信息是臨時的,在用戶離開網站後將被刪除。如果您需要永久儲存信息,可以把數據存儲在數據庫中。

Session 的工作機制是:為每個訪問者創建一個唯一的 id (UID),並基於這個 UID 來存儲變量。UID 存儲在 cookie 中,亦或通過 URL 進行傳導。

我們先來看看session的生命周期,這個對於理解session很重要。

1. session何時創建?

簡單的說Sessinon在用戶訪問第一次訪問服務器時創建,session是由php,jsp,asp等web語言創建的,訪問靜態html頁面是不會創建的。我們以php為例:

a)當用戶X訪問一個php頁面,如果頁面最開始有session_start()函數,那這個時候服務器端就會創建一個session,會產生一個session_id。這個ID是唯一的,每個用戶不同。

b) 這個session id會存儲在PHP的$_SESSION變量中,我們同時可以設置cookie在用戶的浏覽器上。

c) 然後用戶跳轉到網站其他頁面時,只要告訴浏覽器這個cookie裡存儲的session id,然後服務器就取出這個session id對應的存儲的信息,就知道這個用戶是誰,那在另一個頁面也能顯示用戶的這些信息。

d) session創建之後,就可以存儲其他用戶相關的信息了,例如存儲用戶購物車的物品信息。

e) Session生成後,只要用戶繼續訪問,服務器就會更新Session的最後訪問時間,並維護該Session。用戶每訪問服務器一次,無論是否讀寫Session,服務器都認為該用戶的Session“活躍”了一次。


所以,用戶訪問一個網站,正常來說從打開到結束(除非session太快失效)都是在同一個session裡,無論他在這個網站中如何跳轉,都能夠訪問這個session內容。

PHP中 session_id()函數可以看到當前的session_id的信息。因為一個網站可以有很多個用戶同時訪問,PHP會為每個用戶生成唯一的session_id。這樣不會相互干擾,因為每個用戶都是由獨立的進程在處理的,用戶A所在的進程存儲了A的session_id, 直到這個session失效。

總之,一般是在用戶登錄網站的時候設置好session,然後用戶退出的時候關閉或者清理session(關閉還是清理隨業務需求)。

2. session何時失效?

a) 由於會有越來越多的用戶訪問服務器,因此Session也會越來越多。為防止內存溢出,服務器會把長時間內沒有活躍的Session從內存刪除。這個時間就是Session的超時時間。如果超過了超時時間沒訪問過服務器,Session就自動失效了。

b) 調用Session的invalidate方法。


參考:http://www.w3school.com.cn/php/php_sessions.asp

然後常用的幾個PHP的session相關的函數:

session_start — Start new or resume existing session session開始
session_id — Get and/or set the current session id 獲得session id
session_status — Returns the current session status 獲得session status,有三個狀態

  • PHP_SESSION_DISABLED if sessions are disabled.
  • PHP_SESSION_NONE if sessions are enabled, but none exists.
  • PHP_SESSION_ACTIVE if sessions are enabled, and one exists. session_regenerate_id — Update the current session id with a newly generated one 為現在的session重新分配
    session_destroy — Destroys all data registered to a session 徹底刪除整個session
    session_unset — Free all session variables 刪除當前session所存儲的所有變量


    更多請參考:http://www.php.net/manual/en/ref.session.php






  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved