session是一個伺服器全域變數,為何他可以在不同頁面之間切換而不遺失資料並且也不把資料儲存在用戶端呢,下面我們來看看session工作原理與用法。
眾所周知,http協議是一個無狀態協議,簡單來說就是,web伺服器是不知道現在串連上來的人到底是哪個人,為了滿足選擇性發送資訊的需求,在http的基礎上做了很多擴充來達到這個目的,如數位簽章、cookie、session等。
web伺服器或者web程式如何能夠知道現在串連上來的是誰?要解決這個問題,首先需要在伺服器端和用戶端建立一一對應關係,下邊我通過抓取http的內容來說明這種對應關係是如何建立的。
我使用的是一個叫做httplook的http包嗅探工具,然後在本地web伺服器的根目錄下建立一個叫test.php的檔案,地址是:http://localhost/test.php,一切就緒以後我通過瀏覽器反覆開啟這個頁面。
| 代碼如下 |
複製代碼 |
session_start(); if (isset($_SESSION['test_sess'])){ $_SESSION['test_sess']++; }else{ $_SESSION['test_sess'] = 0; } echo $_SESSION['test_sess']; ?>; |
以下是前兩次向伺服器發出的資訊及伺服器返回的資訊
引用:原帖由 "第一次請求伺服器" 發表:
| 代碼如下 |
複製代碼 |
GET /test.php HTTP/1.1 Accept: */* Referer: http://localhost/ Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322) Host: localhost Connection: Keep-Alive |
引用:原帖由 "伺服器第一次返回" 發表:
| 代碼如下 |
複製代碼 |
HTTP/1.1 200 OK Date: Fri, 26 Aug 2005 07:44:22 GMT Server: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2 X-Powered-By: PHP/5.0.4 Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Length: 1 Keep-Alive: timeout=15, max=99 Connection: Keep-Alive Content-Type: text/html; charset=utf-8 Content-Language: Off |
引用:原帖由 "第二次請求伺服器" 發表:
| 代碼如下 |
複製代碼 |
GET /test.php HTTP/1.1 Accept: */* Referer: http://localhost/ Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322) Host: localhost Connection: Keep-Alive Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3 |
引用:原帖由 "伺服器第二次返回" 發表:
| 代碼如下 |
複製代碼 |
HTTP/1.1 200 OK Date: Fri, 26 Aug 2005 07:44:23 GMT Server: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2 X-Powered-By: PHP/5.0.4 Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Length: 1 Keep-Alive: timeout=15, max=98 Connection: Keep-Alive Content-Type: text/html; charset=utf-8 Content-Language: Off |
仔細對比這些輸出,第二次請求比第一次請求多出來的就是:
Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3
這個header將會向伺服器發送一個cookie資訊,告訴伺服器我有一個cookie,名字叫PHPSESSID,內容是bmmc3mfc94ncdr15ujitjogma3。
這個cookie是怎麼來的呢?看第一次伺服器返回的資訊裡邊有:
Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/
這是伺服器向用戶端瀏覽器寫一個cookie,名字是PHPSESSID,值是bmmc3mfc94ncdr15ujitjogma3,這個值實際就是所謂的session_id。
繼續看第二次向伺服器發出的請求,仍然向伺服器發送了PHPSESSID這個cookie
下面我們來看session用法
php中session的用法
PHP中的session預設情況下是使用用戶端的Cookie。當用戶端的Cookie被禁用時,會自動通過Query_String來傳遞。
Php處理會話的函數一共有11個,我們詳細介紹一下將要用到幾個函數。
1、 session_start
函數功能:開始一個會話或者返回已經存在的會話。
函數原型:boolean session_start(void);
傳回值:布爾值
功能說明:這個函數沒有參數,且傳回值均為true。最好將這個函數置於最先,而且在它之前不能有任何輸出,否則會警示,如:Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2) in /usr/local/apache/htdocs/cga/member/1.php on line 3
2、 session_register
函數功能:登記一個新的變數為會話變數
函數原型:boolean session_register(string name);
傳回值:布爾值。
功能說明:這個函數是在全域變數中增加一個變數到當前的SESSION中,參數name就是想要加入的變數名,成功則返回邏輯值true。可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式來取值或賦值。
3、 session_is_registered
函數功能:檢查變數是否被登記為會話變數。
函數原型:boobean session_is_registered(string name);
傳回值:布爾值
功能說明:這個函數可檢查當前的session之中是否已有指定的變數註冊,參數name就是要檢查的變數名。成功則返回邏輯值true。
4、 session_unregister
函數功能:刪除登入的變數。
函數原型:boolean session_session_unregister(string name);
傳回值:布爾值
功能說明:這個函數在當前的session之中刪除全域變數中的變數。參數name就是欲刪除的變數名,成功則返回true.
5、 Session_destroy
函數功能:結束當前的會話,並清空會話中的所有資源。
函數原型:boolean session destroy(void);
傳回值:布爾值。
功能說明:這個函數結束當前的session,此函數沒有參數,且傳回值均為true
上面介紹函數下文將會用到,但還有一些有關session的函數也介紹一下:
6、 session_encode
函數功能:sesssion資訊編碼
函數原型:string session_encode(void);
傳回值:字串
功能說明:返回的字串中包含全域變數中各變數的名稱與值,形式如:a|s:12:"it is a test";c|s:4:"lala"; a是變數名 s:12代表變數a的值"it is a test的長度是12 變數間用分號”;”分隔。
7、 session_decode
函數功能:sesssion資訊解碼
函數原型:boolean session_decode (string data)
傳回值:布爾值
功能說明:這個函數可將session資訊解碼,成功則返回邏輯值true
8、 session_name
函數功能:存取當前會話名稱
函數原型:boolean session_name(string [name]);
傳回值:字串
功能說明:這個函數可取得或重新設定當前session的名稱。若無參數name則表示擷取當前session名稱,加上參數則表示將session名稱設為參數name
9、 session_id
函數功能:存取當前會話標識號
函數原型:boolean session_id(string [id]);
傳回值:字串
功能說明:這個函數可取得或重新設定當前存放session的標識號。若無參數id則表示只擷取當前session的標識號,加上參數則表示將session的標識號設成新指定的id
10、 session_unset
函數功能:刪除所有登入的變數。
函數原型:void session_unset (void)
傳回值:布爾值
功能說明:這個函數和Session_destroy不同,它不結束會話。就如同用函數session_unregister逐一登出掉所有的會話變數
可以得到以下結論:
1、只要使用了session,就會通過cookie的方式向用戶端瀏覽器發送session
2、每次向伺服器發出請求的時候,本地瀏覽器會把cookie附帶在請求資訊中
http://www.bkjia.com/PHPjc/631611.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/631611.htmlTechArticlesession是一個伺服器全域變數,為何他可以在不同頁面之間切換而不遺失資料並且也不把資料儲存在用戶端呢,下面我們來看看session工作原理...