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

php session工作原理分析

編輯:關於PHP編程

session是一個服務器全局變量,為何他可以在不同頁面之間切換而不丟失數據並且也不把數據保存在客戶端呢,下面我們來看看session工作原理與用法。

眾所周知,http協議是一個無狀態協議,簡單來說就是,web服務器是不知道現在連接上來的人到底是哪個人,為了滿足選擇性發送信息的需求,在http的基礎上做了很多擴展來達到這個目的,如數字簽名、cookie、session等。
web服務器或者web程序如何能夠知道現在連接上來的是誰?要解決這個問題,首先需要在服務器端和客戶端建立一一對應關系,下邊我通過抓取http的內容來說明這種對應關系是如何建立的。
我使用的是一個叫做httplook的http包嗅探工具,然後在本地web服務器的根目錄下建立一個叫test.php的文件,地址是:http://localhost/test.php,一切就緒以後我通過浏覽器反復打開這個頁面。

 代碼如下 復制代碼 <?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附帶在請求信息中

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