PHP session與cookie_PHP教程

來源:互聯網
上載者:User
PHP SESSION原理

session是在伺服器端保持使用者會話資料的一種方法,對應的cookie是在用戶端保持使用者資料。HTTP協議是一種無狀態協議,伺服器響應完後就失去了與瀏覽器的聯絡,cookie引入瀏覽器,使得資料跨越頁面交換。

首先用戶端和伺服器端建立一一聯絡,每個用戶端都有一個唯一標識,這樣伺服器才能識別出來。建議唯一標識的方法有兩種:cookie或者通過GET方式指定。預設配置的PHP使用session的時會建立一個名叫”PHPSESSID”的cookie(可以通過php.ini修改session.name值指定),如果用戶端禁用cookie,你也可以指定通過GET方式把session id傳到伺服器(修改php.ini中session.use_trans_sid等參數)。

用戶端將session id傳遞到伺服器,伺服器根據session id找到對應的檔案,讀取的時候對檔案內容進行還原序列化就得到session的值,儲存的時候先序列化再寫入。

事實就是這樣,如果伺服器不支援session或者你想自訂session,完全可以DIY,通過PHP的uniqid產生永不重複的session id,然後找個地方儲存session的內容即可,還可以把session儲存在MySQL資料庫中。

所謂的session其實就是用戶端一個session id,伺服器端一個session file,建立session時,告訴伺服器要產生一個cookie以及準備好session檔案,要不然你的session內容怎麼存;讀取session時告訴伺服器,趕緊根據session id把session檔案還原序列化。

session影響系統效能

session在大訪問量網站上確實影響系統效能,影響效能的原因之一由檔案系統設計造成,在同一個目錄下超過10000個檔案時,檔案的定位將非常耗時,PHP支援session目錄hash,我們可以通過修改php.ini中session.save_path =“2;/path/to/session/dir”,那麼session將儲存在兩級子目錄中,每個目錄有16個子目錄[0~f],不過好像PHPsession不支援建立目錄,你需要事先把那麼些目錄建立好 。

還有一個問題就是小檔案的效率問題,一般我們的session資料都不會太大(1~2K),如果有大量這樣1~2K的檔案在磁碟上,IO效率肯定會很差。可以通過緩衝memcache和mysql資料庫提供效率。

session的同步

前端可能有很多台伺服器,使用者在A伺服器上登入了,種下了session資訊,然後訪問網站的某些頁面沒準跳到B伺服器上去了,如果這個時候B伺服器上沒有session資訊又沒有做特殊處理,可能就會出問題了。

session同步有很多種,如果你是儲存在memcached或者MySQL中,那就很容易了,指定到同樣的位置即可,如果是檔案形式的,你可以用NFS統一儲存。

(NFS是Network File System的簡寫,即網路檔案系統.網路檔案系統是FreeBSD支援的檔案系統中的一種,也被稱為NFS. NFS允許一個系統在網路上與他人共用目錄和檔案。通過使用NFS,使用者和程式可以像訪問本地檔案一樣訪問遠端系統上的檔案。)

還有一種方式是通過加密的cookie來實現,使用者在A伺服器上登入成功,在使用者的瀏覽器上種上一個加密的cookie,當使用者訪問B伺服器時,檢查有無session,如果有當然沒問題,如果沒有,就去檢驗cookie是否有效,cookie有效話就在B伺服器上重建session。這種方法其實很有用,如果網站有很多個子頻道,伺服器也不在一個機房,session沒辦法同步又想做統一登入那就太有用了。

當然還有一種方法就是在負載平衡那一層保持會話,把訪問者綁定在某個伺服器上,他的所有訪問都在那個伺服器上就不需要session同步了。


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; MSIE6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)

Host:localhost

Connection:Keep-Alive

伺服器第一次返回:

HTTP/1.1200 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; MSIE6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)

Host:localhost

Connection:Keep-Alive

Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3

伺服器第二次返回:

HTTP/1.1200 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

可以得到以下結論:

1、只要使用了session,就會通過cookie的方式向用戶端瀏覽器發送session

2、每次向伺服器發出請求的時候,本地瀏覽器會把cookie附帶在請求資訊中

COOKIE

cookie 是一種在遠程瀏覽器端儲存資料並以此來跟蹤和識別使用者的機制。

PHP在http 協議的頭資訊裡發送cookie,因此setcookie()函數必須在其它資訊被輸出到瀏覽器前調用。

原理.

a.伺服器通過隨著響應發送一個http 的Set-Cookie 頭,在客戶機中設定一個cookie(多個cookie 要多個頭)。

b.用戶端自動向伺服器端發送一個http 的cookie 頭,伺服器接收讀取。

HTTP/1.x 200 OK

X-Powered-By: PHP/5.2.1

Set-Cookie:TestCookie=something from somewhere; path=/

Expires: Thu, 19 Nov 2007 18:52:00 GMT

Cache-Control: no-store, no-cache,must-revalidate, post-check=0,pre-check=0

Pragma: no-cache

Content-type: text/html

這一行實現了cookie 功能,收到這行後

Set-Cookie: TestCookie=something fromsomewhere; path=/

瀏覽器將在用戶端的磁碟上建立一個cookie 檔案。

下面的同樣的效果:

setcookie('TestCookie','something from somewhere','/');

header('Set-Cookie:TestCookie=something from somewhere; path=/')

常見問題解決:

1) 用 setcookie()時有錯誤提示,可能是因為調用setcookie()前面有輸出或空格。

2) $_COOKIE 受magic_quotes_gpc 影響,可能自動轉義。

3) 使用的時候,有必要測試使用者是否支援cookie。

下面以使用者登入狀態例分析session和cookie

HTTP協議是一種無狀態協議,伺服器響應完使用者的請求,就失去了與瀏覽器的聯絡,PHP是如何?session的。

使用者第一次訪問伺服器時,因為沒有session資訊,需要登入驗證,使用者通過表單把使用者名稱,密碼,驗證碼等資訊提交給伺服器,伺服器在驗證使用者的合法性之前先對資料進行預先處理。通過到資料庫驗證,使用者是合法的,這個時候伺服器會給瀏覽器資訊中包含Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3;這樣的資訊,這樣瀏覽器會把資訊寫到本地檔案中,其中PHPSESSID為唯一識別碼。同時伺服器也會在指定的檔案把序列化的session資訊儲存在檔案中。當使用者再次請求時,瀏覽器會把對應cookie中的PHPSESSID也發送給伺服器,伺服器得到PHPSESSID,會到session檔案中驗證,如果驗證成功,就直接登入。從而類似的可以實現資料在不同使用者頁面之前的傳遞。session中的值是key-value。

session影響系統效能

session在大訪問量網站上確實影響系統效能,影響效能的原因之一由檔案系統設計造成,在同一個目錄下超過10000個檔案時,檔案的定位將非常耗時,PHP支援session目錄hash,我們可以通過修改php.ini中session.save_path =“2;/path/to/session/dir”,那麼session將儲存在兩級子目錄中,每個目錄有16個子目錄[0~f],不過好像PHPsession不支援建立目錄,你需要事先把那麼些目錄建立好 。

還有一個問題就是小檔案的效率問題,一般我們的session資料都不會太大(1~2K),如果有大量這樣1~2K的檔案在磁碟上,IO效率肯定會很差。可以通過緩衝memcache和mysql資料庫提供效率。

session的同步

前端可能有很多台伺服器,使用者在A伺服器上登入了,種下了session資訊,然後訪問網站的某些頁面沒準跳到B伺服器上去了,如果這個時候B伺服器上沒有session資訊又沒有做特殊處理,可能就會出問題了。

session同步有很多種,如果你是儲存在memcached或者MySQL中,那就很容易了,指定到同樣的位置即可,如果是檔案形式的,你可以用NFS統一儲存。

(NFS是Network File System的簡寫,即網路檔案系統.網路檔案系統是FreeBSD支援的檔案系統中的一種,也被稱為NFS. NFS允許一個系統在網路上與他人共用目錄和檔案。通過使用NFS,使用者和程式可以像訪問本地檔案一樣訪問遠端系統上的檔案。)

還有一種方式是通過加密的cookie來實現,使用者在A伺服器上登入成功,在使用者的瀏覽器上種上一個加密的cookie,當使用者訪問B伺服器時,檢查有無session,如果有當然沒問題,如果沒有,就去檢驗cookie是否有效,cookie有效話就在B伺服器上重建session。這種方法其實很有用,如果網站有很多個子頻道,伺服器也不在一個機房,session沒辦法同步又想做統一登入那就太有用了。

還有一種方法就是在負載平衡那一層保持會話,把訪問者綁定在某個伺服器上,其他所有訪問都在那個伺服器上就不需要

http://www.bkjia.com/PHPjc/477521.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/477521.htmlTechArticlePHP SESSION原理 session是在伺服器端保持使用者會話資料的一種方法,對應的cookie是在用戶端保持使用者資料。HTTP協議是一種無狀態協議,伺服器...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.