2011-04-09 19 views
2

我剛開始學習使用PHP進行編程,並遇到了一個稍微混亂的區域Sessions和Cookies。PHP會話和Cookie的目的及其差異

我明白服務器端和客戶端存儲的差異,但我不知道它們是如何區分的以及在什麼情況下每個都適合?

此外,我看到有人說cookie可以用來存儲會話ID,這將如何完成,爲什麼這將是有利的?

感謝您的任何反饋意見。

+2

當你設置一個會話php也設置一個cookie。 – Neddy 2011-04-10 00:51:24

回答

1

在會話中使用cookie的好處是Cookie 是持久的

換句話說,當用戶幾周後訪問您的網站時,他們的會話可能已過期。但是,如果他們有一個可以唯一標識腳本的cookie,則可以自動登錄並重新建立會話。

......什麼情況下每個都適合?

答案看起來是這樣的:

  • 會話數據應該包含並不需要是持續性或只需要很短的時間段的信息。例如,如果您向用戶呈現多頁表單,則利用會話是有意義的。
  • Cookie應該用於存儲ID或散列,該ID或散列不僅可以唯一標識用戶,還可以標識他們使用的瀏覽器/設備。請記住,Cookie數據超出了您的控制範圍,只能由用戶發出的HTTP請求(或在某些情況下,通過頁面上的腳本)操縱/刪除。

而且,我看到有人說,該cookie可以被用來存儲會話ID ...

我假設什麼是由這意味着被存儲在一個獨特的價值一個識別他們正在使用的用戶/瀏覽器/設備的cookie。實現這樣的東西看起來像:

  • 讓用戶登錄,因爲他們通常會。
  • 生成一個獨特的散列(SHA-1是你最好的選擇)並將它存儲在一個cookie中。您還將散列存儲在鏈接到該用戶的數據庫中。
  • ...
  • 用戶在會話過期並返回頁面後返回。
  • 您的腳本會看到cookie並查找散列所屬的用戶。
  • 的用戶登錄。
3

首先,讓我們來胸圍的長期神話(或至少我認爲這是一個神話存在),會話cookie的東西比普通的cookie不同。不是這樣。會話cookie只是一個常規的cookie。只有被設置(或者沒有設置)的會話cookie的屬性通常是不同的。但機制完全一樣。

一個cookie通過發送HTTP響應報頭添加到瀏覽器中設置:

Set-Cookie: name=value[; possible expiration-date][; other possible properties]

什麼通常從常規的cookie進行區分的會話cookie是沒有到期日設置( 或期滿日期設置爲過去的日期 )。這意味着瀏覽器在關閉瀏覽器後將處理cookie。但是「常規」cookie也可以做到這一點。這樣就可以說它是一個'會話cookie'。

現在我們已經完成了;除了上面提到的屬性之外,Cookie通常被應用程序用來使它們充當更多的會話cookie的機制是,cookie的價值僅包含某種唯一可識別的值。也許md5也許是sha1散列。

每次瀏覽器請求它沿着該Cookie發送(除非它已過期)與HTTP請求頭是這樣的服務器上的資源:在後端

Cookie: name=value

會話機制(即在你的情況下,PHP)將cookie的唯一ID與存儲在服務器文件系統中的文件或數據庫中的數據相關聯。這樣,每次接收到cookie時,都可以檢索這些數據並將其鏈接到請求。

這樣做的好處是,敏感信息1)可以隱藏起來,不必通過網絡傳播,並且2)不會在用戶瀏覽器Cookie緩存中結束,而是保留在服務器上。

因此,基本上你想要在普通的cookie中發送非敏感和非應用程序重要的信息(想想:佈局偏好,非持久播放列表,比如在YouTube上等),並使用一個存儲敏感信息的會話。

編輯:
對不起,忽略「或到期日期設置爲在過去的日期」,因爲它是假的。這將導致cookie立即被瀏覽器無效,從而不再與請求一起發送。

0

Cookie和會話都用於保留用戶特定信息以跟蹤用戶。很多時候你可以使用任何一種,但他們有一些差異。

cookie是保存在用戶機器上的文本文件。每次用戶訪問您的網站時,他都會將cookie移交給您,讓您知道他是誰。這樣做的好處是信息保存在別人的機器上,所以你不必擔心。因此,你可以把它留在那裏,直到母牛回家。當/如果用戶回來,他會帶着他的信息。缺點是信息無法控制,因爲用戶可以輕鬆編輯您給他的cookie。這使得cookie中的任何信息都不可靠,並且必須在用戶每次向您提供時進行檢查。

會話就像一個cookie,除非您將信息保存在服務器上。優點是您可以相信會話可以保持數據與您放入數據時的完全一致。缺點是您必須存儲這些信息,這意味着最終您需要放棄這些信息,以免Web服務器填滿信息這將永遠不會被使用。

現在,這是它有點棘手。雖然會話的機制如上所述,但實際實現可能因PHP的設置而異。會話數據可以保存在單獨的文本文件中或服務器上的數據庫中。你還需要一些方法來識別哪個會話對應哪個用戶。通常(但不是唯一)的方式是使用cookie。會發生什麼是實際數據保留在您的服務器上,並鏈接到唯一的會話ID。該會話ID號被放在cookie上並提供給用戶,以便您稍後可以在他回來時查看他的數據。

上述過程由PHP在使用會話功能時自動執行;你不需要手工執行它。如果因爲某種原因需要更改會話的實現方式,可以通過在php.ini中更改會話參數來實現。