<?php
$USERID = "PHPer";
$CookieTime = 0;
setcookie("USERID", "$USERID", time() + $CookieTime, "/", "btcuxiao.com");
執行後 Cookie 為空,換頁即失效。開發者誤以為 time()+0 代表「瀏覽器進程」,實則不然。
| 誤區 | 錯誤代碼 | 正確認知 |
|---|---|---|
| 過期時間計算 | time() + 0 = 當前 Unix 時間戳 | 直接設為 0 才代表 Session Cookie(瀏覽器關閉即失效) |
| Domain 設定 | "btcuxiao.com" | 需 ".btcuxiao.com"(前綴點)支援子域名,或留空由瀏覽器自動推導 |
| 即時可讀性 | 設定後立即 $_COOKIE['USERID'] | Cookie 需下一次 HTTP 請求才會出現在 $_COOKIE 中 |
<?php
$USERID = "PHPer";
// 瀏覽器進程 Cookie:expire = 0,domain 留空(當前域名),path = "/"
setcookie("USERID", $USERID, 0, "/", "");
// 驗證:首次請求無輸出,重新整理後顯示
echo isset($_COOKIE['USERID']) ? $_COOKIE['USERID'] : '尚未生效(請重新整理)';
setcookie(
string $name, // Cookie 名稱
string $value = "", // 值(自動 urlencode)
int $expires = 0, // 過期時間:0=Session Cookie;Unix 時間戳=持久 Cookie
string $path = "/", // 生效路徑,"/" 代表全站
string $domain = "", // 生效域名:""=當前域;".example.com"=含子域
bool $secure = false, // 僅 HTTPS 傳輸
bool $httponly = false // 禁止 JS 存取(防 XSS)
);
| 設定值 | 生效範圍 | 適用場景 |
|---|---|---|
""(留空) | 當前主機名(不含子域) | 單域名應用、本地開發 |
".example.com" | example.com 及所有子域(a.example.com, b.a.example.com) | 多子域共享登入態(SSO) |
"example.com" | 僅 example.com(現代瀏覽器同 ".example.com",但標準建議加點) | 不推薦 |
"sub.example.com" | 僅指定子域 | 隔離子域 Cookie |
關鍵規則:Domain 必須包含當前請求的主機名,否則瀏覽器拒絕設定(安全策略)。
// 請求 1:瀏覽器 → 伺服器
// 無 Cookie 標頭
// 伺服器執行 setcookie() → 回應攜帶 Set-Cookie 標頭
// 瀏覽器接收,寫入記憶體(Session Cookie)或硬碟(持久 Cookie)
// 請求 2:瀏覽器 → 伺服器(重新整理/跳轉)
// 瀏覽器自動附加 Cookie 標頭
// 伺服器 $_COOKIE 才有值
這是 HTTP 協議無狀態特性 決定的:Cookie 是下一次請求才隨標頭發送的。
setcookie('remember_token', $token, time() + 30*86400, '/', '.example.com', true, true);
setcookie('cart_session', $cartId, 0, '/', '', true, true);
// 主域登入後
setcookie('sso_token', $token, 0, '/', '.example.com', true, true);
// 子域讀取即可共享
setcookie('name', '', time() - 3600, '/', '.example.com'); // 過期時間設過去
document.cookie 存取,防 XSS 竊取 Session ID。所有認證類 Cookie 必開。// 現代框架預設行為(Laravel/Symfony/ThinkPHP)
setcookie($name, $value, $expire, $path, $domain, true, true);
Cookie: 是否正確發送Set-Cookie: 格式、屬性是否符合預期curl -v -b cookies.txt -c cookies.txt https://example.com/PHP setcookie() 看似簡單,實則蘊含 HTTP 協議、瀏覽器安全模型、域名匹配規則 等多層知識。核心要訣:
time()+0掌握這些,即可駕馭從「記住我」到「跨域單點登入」的所有 Cookie 場景。