PHP Cookie 面試題
Cookie 是 HTTP 協(xié)議中的一種機(jī)制,它可以在客戶端存儲(chǔ)一些數(shù)據(jù),并在每次請(qǐng)求時(shí)隨請(qǐng)求一起發(fā)送給服務(wù)端。Cookie 可以解決 HTTP 協(xié)議無狀態(tài)的問題,這樣服務(wù)端就可以接收到客戶端的狀態(tài)信息了。
在 PHP 中,我們可以通過 setcookie() 函數(shù)來設(shè)置 Cookie。
setcookie(name,value,expire,path,domain,secure,httponly);
其中,name 和 value 表示 Cookie 的名稱和值;expire 表示 Cookie 的過期時(shí)間,這個(gè)時(shí)間是 Unix 時(shí)間戳,如果過期時(shí)間是某個(gè)時(shí)間點(diǎn),在 PHP 中可以通過 time() 函數(shù)來獲取這個(gè)時(shí)間點(diǎn)的時(shí)間戳;path 表示 Cookie 的路徑;domain 表示要發(fā)送 Cookie 的域名;secure 表示 Cookie 是否只能通過 HTTPS 協(xié)議發(fā)送;httponly 表示 Cookie 是否只能通過 HTTP 協(xié)議訪問,這個(gè)屬性可以防止 XSS 攻擊。
在 PHP 中,我們可以通過 $_COOKIE 變量來獲取客戶端發(fā)送過來的 Cookie。
echo $_COOKIE["name"];
上面的代碼就可以獲取名為 name 的 Cookie 的值。
當(dāng)客戶端發(fā)送請(qǐng)求時(shí),服務(wù)端會(huì)自動(dòng)接收到 Cookie。我們可以通過下面的代碼來查看客戶端發(fā)送過來的所有 Cookie。
print_r($_COOKIE);
如果客戶端發(fā)送過來了過期的 Cookie,服務(wù)端會(huì)自動(dòng)忽略這個(gè) Cookie,這個(gè)時(shí)候可以通過 unset() 函數(shù)來刪除這個(gè) Cookie。
unset($_COOKIE["name"]);
使用 unset() 函數(shù)可以刪除名為 name 的 Cookie。
除了 setcookie() 函數(shù),PHP 還提供了一個(gè) session_set_cookie_params() 函數(shù),該函數(shù)可以修改 session_id 的 Cookie 參數(shù)。例如:
session_set_cookie_params(3600,"/",".example.com",true,true); session_start();
上面的代碼表示:會(huì)話 Cookie 的過期時(shí)間為 3600 秒;路徑為根目錄(/);發(fā)送Cookie的域名是 example.com;只能通過 HTTPS 協(xié)議發(fā)送;只能通過 HTTP 協(xié)議訪問。
除了上述的基礎(chǔ)知識(shí),面試官還可能會(huì)問到 Cookie 的應(yīng)用場(chǎng)景,比如:
- 用戶登錄狀態(tài)的保持
- 購(gòu)物車信息的保存
- 網(wǎng)站主題設(shè)置的保存
比如我們?cè)?A 網(wǎng)站登錄后,如果不關(guān)閉瀏覽器,一段時(shí)間內(nèi)再次訪問A 網(wǎng)站時(shí),我們就不需要重新登錄了。這是因?yàn)锳 網(wǎng)站使用了 Cookie 來保存用戶的登錄狀態(tài)。
在購(gòu)物網(wǎng)站中,我們可以不登錄就可以將商品添加到購(gòu)物車中,繼續(xù)瀏覽網(wǎng)站,下次再訪問時(shí)商品仍在購(gòu)物車中,這是因?yàn)橘?gòu)物網(wǎng)站使用了 Cookie 來保存購(gòu)物車信息。
網(wǎng)站的主題設(shè)置有時(shí)也會(huì)存在在 Cookie 中,這樣可以在下一次訪問時(shí)依然使用用戶之前選擇過的主題,不必每次都重新選擇。
總結(jié)
Cookie 是一種在客戶端存儲(chǔ)數(shù)據(jù)的機(jī)制,它可以解決 HTTP 協(xié)議無狀態(tài)的問題,用來保存用戶信息、購(gòu)物車信息等。在 PHP 中,我們可以使用 setcookie() 函數(shù)來設(shè)置 Cookie,并且通過 $_COOKIE 變量來獲取客戶端發(fā)送過來的 Cookie。