Cookie 是伺服器儲存在使用者瀏覽器端的小型文字資料(通常 ≤ 4KB)。每次瀏覽器向同一網域發送請求時,會自動攜帶該網域下的所有 Cookie,讓無狀態的 HTTP 協定得以實現「狀態管理」——例如記住登入狀態、購物車內容、偏好設定等。
setcookie(),在 HTTP 回應標頭中加入 Set-Cookie。Cookie 標頭中帶上符合條件(網域、路徑、未過期、Secure/HttpOnly 等)的 Cookie。Cookie 標頭,填入 $_COOKIE 超全域陣列。setcookie() 完整簽名setcookie(
string $name,
string $value = '',
int $expires_or_options = 0,
string $path = '',
string $domain = '',
bool $secure = false,
bool $httponly = false
): bool
常用參數:
$name:Cookie 名稱(鍵名)$value:儲存值(純字串,建議 json_encode() 序列化複雜結構)$expires:Unix 時間戳;0 或省略 = 瀏覽器關閉即失效(Session Cookie);負值 = 立即刪除$path:生效路徑,預設為當前腳本目錄,建議設為 / 全站有效$domain:生效網域,預設為當前主機,可設 .example.com 共享給子網域$secure:僅 HTTPS 傳輸$httponly:禁止 JavaScript 存取(防 XSS),強烈建議開啟$value = 'the best way is by yourself';
setcookie('cookiename', $value, time() + 60*60*24*7, '/', '', false, true);
if (isset($_COOKIE['cookiename'])) {
echo $_COOKIE['cookiename']; // 輸出:the best way is by yourself
}
// 寫法一:數字索引
setcookie('CookieArray[0]', 'Value1');
setcookie('CookieArray[1]', 'Value2');
// 寫法二:關聯索引
setcookie("CookieArray['one']", 'Value1');
setcookie("CookieArray['two']", 'Value2');
// 讀取時 $_COOKIE['CookieArray'] 即為陣列
// 方法一:只傳 name,或將 expires 設為過去時間
setcookie('MyCookie', '', time() - 3600, '/'); // 建議保留 path/domain 一致
// 方法二:PHP 7.3+ 可用選項陣列
setcookie('MyCookie', '', ['expires' => time() - 3600, 'path' => '/']);
// 注意:刪除後當前請求的 $_COOKIE 仍保留值,需重新整理才消失
setcookie('session_flag', '1', 0, '/'); // expires=0
| 問題 | 原因 | 解決 |
|---|---|---|
| setcookie() 無效 | 輸出內容前已有空白、HTML、BOM、echo | 確保 setcookie() 在任何輸出之前;或開啟 output_buffering |
| 當前頁面讀不到剛寫入的 Cookie | $_COOKIE 只反映「請求時」的 Cookie | 重新導向或重新整理頁面 |
| 子目錄讀不到根目錄設的 Cookie | 預設 path 為當前目錄 | 明確設定 path=/ |
| 用戶禁用 Cookie | 瀏覽器設定、隱私模式 | 備援方案:Session ID 放 URL、LocalStorage、指紋識別 |
| 中文亂碼 | Cookie 值只支援 ASCII | urlencode() 寫入,urldecode() 讀取,或 base64_encode() |
Cookie 是客戶端狀態管理的基石。掌握 setcookie() 七個參數、理解「請求/回應」週期、養成 HttpOnly、Secure、path=/ 的安全習慣,並預備無 Cookie 環境的降級策略,才能建立健壯的 Web 應用。