搜尋
首頁後端開發php教程PHP 不得不提起的 session 與 cookie

PHP 不得不提起的 session 與 cookie

Sep 11, 2019 am 11:25 AM
cookiephpsession

PHP 不得不提起的 session 與 cookie

session 與 cookie 是什麼?

session 與 cookie 屬於一種會話控制技術。常用在身分識別,登入驗證,資料傳輸等。舉個例子,就像我們去超市買東西結帳的時候,我們要拿出我們的會員卡才會獲得優惠。這時候,我們要怎麼辨識這個會員卡真實有效的呢?當我們將會員號碼給到收銀員,收銀員根據我們提供的會員號,輸入到系統中,系統根據這個會員號去查詢,如果查詢到了就證明這個會員號是真實存在的。這裡的會員號碼就好比 cookie 與 session. 會員系統就好比伺服器端,收銀員就好比客戶端.

 為什麼會用到 session 與 cookie 呢?

根據上述的例子,我們知道 session 與 cookie 是可以做什麼的了,那為什麼必須用這個來實現呢?這裡就有必要了解 http 應用傳輸協定的特點了。由於http 協定是無狀態的,即瀏覽器去請求了一個網頁,這時候就是一個http 請求,當服務端接收到請求之後,返回客戶端需要的數據,在這過程中瀏覽器與伺服器是建立了一個連接的。但是當服務端傳回數據,客戶端收到數據之後,他們的這種連接關係就斷開了。下次瀏覽器再去發送請求的時候,又是重新建立一個連接,這兩個連結沒有任何關係。試想一下,當我們登入一個商場系統的時候,進入首頁做了登錄操作,但是我們下單或者加入購物車的時候,還需要登錄,每訪問一個頁面就要登錄,是不是很繁瑣同時也是很不科學的,萬一我們加入購物車的商品,我們點擊下單了,下單頁面要登錄而且還無法正確的反饋出你下單時的那些商品.

 Http 特點

1.http 協定支援客戶端/ 服務端模式,也是一種請求/ 回應模式的協定。

2. 無連線。所謂的無連線就是伺服器收到了客戶端的請求之後,回應完成並收到客戶端的應答之後,即斷開連線。限制每次的連線只處理一次請求。從而節省傳輸時間。

3. 無狀態。 http 協定對事務的處理沒有記憶能力。也意味著如果需要前面的訊息,只能重傳,這無形之中增加資料的傳輸量。這種方式某種方面上講解放了伺服器,但是卻不利於客戶端與伺服器的連線。為了彌補這個不足,產生了兩種記錄 http 狀態的技術,一個叫做 Cookie, 一個叫做 Session,後面我們再細講它們。

4. 簡單快速:所謂的簡單快速是指客戶端向伺服器要求服務時,一般來說只需要傳輸請求方法和路徑,就能進行存取

5. 靈活:這裡主要指的是客戶端可以透過http 協定傳輸任意類型的資料。例如傳輸.jpg 檔案、.ppt 檔案等等,只需要設定 content-type 就可以進行傳輸。

 Cookie

 cookie 的基本概念

cookie 是遠端瀏覽器儲存資料以此追蹤使用者和識別使用者的機制,從實作來說,cookie 是儲存在客戶端上的資料片段。

 cookie 的運作原理與儲存機制

. 運作原理

1. 客戶端向服務端發起一個http 請求.

2. 服務端設定一個建立cookie 的指令,回應給客戶端.

3. 客戶端收到服務端回應的指令,根據指令在客戶端建立一個cookie.

4. 擋下一次請求時,客戶端攜帶這個cookie 向服務端發送請求.

#. 儲存機制

總的來說,cookie 在客戶端儲存的形式有三種,不同的瀏覽器的儲存機制不同,存的cookie 也不同.

1. 檔案儲存。瀏覽器會針對不同的網域,在磁碟的對應目錄建立一個單獨的文件,來儲存該網域下面的 cookie 值.

2. 記憶體儲存。當瀏覽器關閉時,該 cookie 隨之消失。根據下面的建立語法,當我們未設定過期時間時則會出現這種情況.

3.flash 儲存。這種儲存方式是永久儲存在磁碟中,即使透過瀏覽器刪除一些資料都是無法刪除該方式儲存的cookie,如果需要刪除,可能透過磁碟的方式.

 cookie 的設置

Bool setcookie(string $name[, string $values, $expire=0[,string $path[,string $domain[, bool $secure = false[, bool $httpOnly = false]]]]] );

$name:cookie儲存的名稱,必填選項.

$values:cookie儲存的值。這裡要注意的是,當把該值設為false時,客戶端會嘗試刪除這個cookie值,因此在要將值這是為true或false的時候,我們用另外的值來代替,例如true用1代替,false用0來代替.

$expire:cookie的过期时间,秒为单位,当该值被设置时,定时删除;当该值没有设置时,该值是永久有效的.该值设置为小于当前时间时,会出发浏览器的删除机制,会自动删除cookie.

$path:cookie有效的目录,默认的目录是"/",即表示当前的正个域名都生效.

$domain:cookie的作用域名,默认的是当前域名有效,如果需要设置直接填写生效的域名即可.需要注意的是IE浏览器有长度限制,当只有大于5的时候才会生效.

$secure:cookie的加密处理,当设置为true的时候,需要使用HTTPS协议,才会生效.

$httpOnly:决定cookie是否只使用http协议,当设置为1或者true,其他非http协议是无法操作cookie的。例如我们未设置的时候,我们JavaScript是可以对cookie进行设置的.这样一定程度上保证了安全性.这种情况需考虑浏览器是否支持该配置项.

. 设置 cookie 的函数还有 setrawcookie () 函数,只不过该函数不会对值 进行 urlencode 序列号.

. 有时候,我们可能遇到这种情况,我们在这个页面设置了 cookie,但是去刷新页面获取 cookie,按理说是会获取到 cookie 的,但实际情况是无法获取到,这是由于 cookie 运行机制导致,PHP 创建了 cookie 这个指令,告诉浏览器,你需要执行这个指令了,这时候浏览器才会去执行这个指令,因此是无法获取到 cookie 的.

. 在设置 cookie 之前,不能有任何输出.

// 实现方式一
setcookie($cookie,"hello,world!", 3600);
// 实现方式二
header("header("Set-Cookie: testcookie=中文; path=/; domain=.sunphp.org; expires=".gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT",time()+9600));");
// 两则的作用是一样的,setcookie是PHP内置函数,是对http协议的操作封装。

 cookie 的获取

$_COOKIE['$cookeName'];

 cookie 的应用

. 用户身份识别

. 数据传输

. 登录控制 (是否登录、单点登录)

 cookie 跨域设置

我们都知道,在前端开发中时常会遇到 ajax 跨域问题,我们解决的方式有很多种,可以参考这篇文章传送门 1,传送门 2,cookie 跨域我们可以参考 p3p 传输协议传送门

 cookie 使用的注意事项

. 数量限制,客户端对每一个 domian 下的 cookie 是有数量限制的,不是创建任意数量就行.

. 安全性,根据上面的创建语法,我们可以得知,当我们未设置 $httpOnly 值得时候,非 http 协议是可以操作 cookie 的值的,例如 JavaScript 通过 cookie ($cookieName). 而且一些抓包工具也是可以抓取到 cookie 的,还有就是 cookie 存储在客户端的文件中,如果获取到这个 cookie,也是可以对 cookie 做一些操作的。为了防止别人可以拷贝 cookie 文件,进行恶意操作,可以对 cookie 进行加密处理.

数据传输:当 cookie 数量很多,数据很大的时候,其实对于带宽是有消耗的。比较 http 传输都需要带宽,当 http 传输的数据量大了,带了的带宽消耗就大.

 Session

 运行原理与存储机制

. 运行原理

1. 客户端向服务端发起请求,建立通信

2. 服务端根据设置的 session 创建指令,在服务端创建一个编号为 sessionid 的文件,里面的值就是 session 具体的值 (组成部分 变量名 | 类型 : 长度:值).

3. 服务端将创建好的 sessionid 编号响应给客户端,客户则将该编号存在 cookie 中 (一般我们在浏览器存储的调试栏中会发现 cookie 中有一个 PHPSESSID 的键,这就是 sessionid,当然这个名称,我可以通过设置服务端是可以改变的).

. 当下一次请求时,客户端将这个 sessionid 携带在请求中,发送给服务端,服务端根据这个 sessionid 来做一些业务判断.

. 存储机制

1. 存储方式.session 默认是文件存储的。我们可以通过 php.ini 的配置来设置存储驱动传送门

2. 生命周期。当我们未设置 session 的生命周期时,当浏览器关闭之后存储在客户端的 phpsessid 自动消失,因为它是存在内存,下次建立连接的时候会重新创建一个 phpsessid. 之前的 session,PHP 会自动的根据垃圾回收机制自动删除。这里我们可以根据 session_set_cookie_params ($expire) 函数来设置一个生命周期;

 session 的设置

session_start();
$_SESSION = $values;

. session_start () 设置之前,不能有任何输出

 session 的获取

$_SESSION['values'];

 session 的删除

// 只是单纯的给重新赋了一个空的值
$_SESSION['values'] = '';
// 该函数是清空所有的session,慎用!
session_destroy();
// 连values这个session键都会删除
unset($_SESSION['values']);

 session 的使用场景

. 用户身份识别

. 数据传输

. 登录控制 (是否登录、单点登录)

 session 的注意事项

. 安全性,sessionid 是按照一定的算法生成,要保证 session 的值唯一性和随机性.

. 用戶端停用cookie,根據上面session 的運作原理可以得出,session 的儲存於傳送還是依賴於客戶端,因此當客戶端停用cookie 時,客戶端是無法保存PHPSESSID 的,這時候可以透過url 重寫或表單來實現session 的傳輸.

. 儲存優化,按照上面的session 創建,所有的session 都會創建在一個目錄下面,同時有的無效session 在垃圾回收機制時間內還不會刪除,當一台伺服器配置的站點較多時,這時候會產生很多的session 文件,導致我們讀取速度變慢,我們可以設置session 的存儲目錄級別,save_path 函數. 一般大型的項目(如分佈式的項目), 可以使用其他的存儲方式,如數據存儲,內存存儲.

 session 與cookie 的區別

. session 存儲在服務端,cookie 存儲在客戶端.

.cookie 的建立指令由服務端設定.

.session 的sessionid 需要客戶端儲存.

 cookie 與session 的幾個誤區

. 用戶端禁止cookie,session 無法使用?

使用url重寫或表單提交可以實現.

.session 和 cookie 的安全性比較,session 存在客戶端安全性更高?

由於cookie是存在客戶端的,相對來說安全性是要低一些,不過在創建的時候可以設定$httpOnly值.

由於cookie與session是相互關聯的,獲取到cookie一定程度上取得到了session,同樣可以操作session.

.cookie 與session 是不是在瀏覽器關閉的時候會消失?

這需要查看儲存機制了。 cookie可以存文件,內存,flash.存內存當然瀏覽器關閉則消失了;session由於垃圾回收機制,當在垃圾回收機制內是不會刪除的,除非你代碼中顯示的做了刪除操作.

.cookie 是儲存在客戶端中,如何增加其安全性?

我們可以在設定cookie的時候,增加一些特殊參數,如客戶端資訊ip、瀏覽器資訊等.

. 當cookie 存在客戶端的檔案中,是不是每個瀏覽器取得到這個檔案都可以進行操作?

要看瀏覽器之間對cookie的管理機制是不是一樣.

相關推薦:《PHP教學

以上是PHP 不得不提起的 session 與 cookie的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:learnku。如有侵權,請聯絡admin@php.cn刪除
PHP與Python:了解差異PHP與Python:了解差異Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

php:死亡還是簡單地適應?php:死亡還是簡單地適應?Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來:改編和創新PHP的未來:改編和創新Apr 11, 2025 am 12:01 AM

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。

您什麼時候使用特質與PHP中的抽像類或接口?您什麼時候使用特質與PHP中的抽像類或接口?Apr 10, 2025 am 09:39 AM

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?Apr 10, 2025 am 09:38 AM

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。Apr 10, 2025 am 09:37 AM

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP如何安全地上載文件?PHP如何安全地上載文件?Apr 10, 2025 am 09:37 AM

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

什麼是無效的合併操作員(??)和無效分配運算符(?? =)?什麼是無效的合併操作員(??)和無效分配運算符(?? =)?Apr 10, 2025 am 09:33 AM

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)