Cookie 是伺服器儲存在客戶端的小型文字檔,用於識別用戶、保存偏好設定、實現「記住我」等功能。與 Session 儲存在伺服器端不同,Cookie 由瀏覽器自動攜帶於每次 HTTP 請求中。
setcookie()bool setcookie(
string $name,
string $value = "",
int $expire = 0,
string $path = "",
string $domain = "",
bool $secure = false,
bool $httponly = false
)
| 參數 | 說明 |
|---|---|
name | 必要,Cookie 名稱 |
value | 值,留空或設為空字串可刪除 Cookie |
expire | Unix 時間戳,0 或省略 = 瀏覽器關閉失效(Session Cookie) |
path | 生效路徑,預設 /(全站),設為 /admin 僅限該路徑及子路徑 |
domain | 生效域名,預設當前域名,可設 .example.com 共享子域名 |
secure | true 表示僅 HTTPS 傳輸 |
httponly | true 禁止 JavaScript 存取,緩解 XSS |
setcookie("lang", "zh-TW"); // Session Cookie,關閉瀏覽器失效
// 1 小時後過期
setcookie("token", "abc123", time() + 3600);
// 1 天後過期
setcookie("remember", "yes", time() + 86400);
// 指定日期過期(2025-12-31 23:59:59)
setcookie("promo", "2025", mktime(23, 59, 59, 12, 31, 2025));
// 僅 /admin 路徑可存取
setcookie("admin_pref", "dark", 0, "/admin");
// 共享所有子域名
setcookie("session_id", "xyz", time()+3600, "/", ".example.com");
// 僅 HTTPS + 禁止 JS 存取
setcookie("secure_token", "secret", [
'expires' => time() + 3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict' // PHP 7.3+ 支援
]);
// 必須在「下一次請求」才能讀到剛設定的值
if (isset($_COOKIE['lang'])) {
echo "語言偏好:" . htmlspecialchars($_COOKIE['lang']);
}
注意:setcookie() 後同請求內 $_COOKIE 不會立即更新,需重新整理或導向才能讀取。
// 設定過期時間為過去
setcookie("token", "", time() - 3600);
// 或明確指定路徑/域名與建立時一致
setcookie("admin_pref", "", time() - 3600, "/admin");
切勿使用 unset($_COOKIE['name']),這只刪除當前陣列元素,不會通知瀏覽器移除。
setcookie() 屬標頭操作,必須在任何 echo, print, HTML 空白之前執行,否則觸發 Headers already sent 警告。json_encode() / serialize()。encrypt())。'samesite' => 'Lax' 防禦 CSRF。| 特性 | Cookie | Session |
|---|---|---|
| 儲存位置 | 客戶端瀏覽器 | 伺服器端(檔案/Redis/DB) |
| 容量 | ~4KB | 較大(受伺服器設定限制) |
| 安全性 | 可被竄改、側錄 | 較高,僅傳遞 Session ID |
| 生命週期 | 可設定持久化 | 通常瀏覽器關閉失效 |
| 典型用途 | 偏好設定、記住登入、追蹤 | 用戶狀態、購物車、權限驗證 |
掌握 Cookie 完整生命週期控制,是打造個性化、安全 Web 體驗的基石。