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中文網其他相關文章!

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

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

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

禪工作室 13.0.1
強大的PHP整合開發環境

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

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