cookie($name, $value = '', $option = null)
ThinkPHP 封裝原生 setcookie() 與 $_COOKIE,提供統一介面處理設置、讀取、刪除,支援陣列值、JSON 編碼、前綴、過期時間、路徑、域名等完整選項。
cookie('name', 'value'); // 預設過期時間 (COOKIE_EXPIRE)
cookie('name', 'value', 3600); // 指定秒數過期
自動 JSON 編碼/解碼,節省空間:
cookie('user', ['id' => 1, 'name' => 'admin', 'role' => 2]);
cookie('name', 'value', [
'expire' => 3600, // 有效期(秒)
'prefix' => 'think_', // 前綴,預覽 COOKIE_PREFIX
'path' => '/', // 路徑,預覽 COOKIE_PATH
'domain' => '.example.com' // 域名,預覽 COOKIE_DOMAIN
]);
cookie('name', 'value', 'expire=3600&prefix=think_');
部分參數會與配置檔預設值合併,無需全部指定。
$value = cookie('name');
內部自動處理前綴:
$_COOKIE['name']think_:$_COOKIE['think_name']若值為 JSON 陣列,自動解碼回 PHP 陣列。
cookie('name', null); // 刪除單一
cookie(null); // 清空當前前綴所有 Cookie
cookie(null, 'think_'); // 清空指定前綴所有 Cookie
'COOKIE_PREFIX' => 'think_', // 前綴,避免衝突 'COOKIE_EXPIRE' => 3600, // 預設過期秒數 'COOKIE_PATH' => '/', // 作用路徑 'COOKIE_DOMAIN' => '', // 作用域名,跨子域設為 '.example.com' 'COOKIE_SECURE' => false, // 僅 HTTPS 傳輸 'COOKIE_HTTPONLY' => true, // 阻止 JS 讀取,防 XSS
// 登入成功
cookie('user_auth', ['uid' => $uid, 'token' => $token], 86400 * 7); // 7 天
// 權限檢查中介層
$user = cookie('user_auth');
if (!$user || !validate_token($user['uid'], $user['token'])) {
redirect('login');
}
if ($remember) {
cookie('remember_me', encrypt($uid . '|' . $token), 86400 * 30);
} else {
cookie('remember_me', null); // 刪除
}
// 主域 .example.com 所有子域可讀
cookie('sso_token', $token, ['domain' => '.example.com', 'path' => '/']);
// 子域登出需同步清除
cookie('sso_token', null, ['domain' => '.example.com', 'path' => '/'])
HTTPONLY、SECURE (HTTPS 環境)。| 現象 | 可能原因 | 解決 |
|---|---|---|
| 設置後立即讀取為空 | Cookie 隨 HTTP 響應發送,下一次請求才可讀 | 重定向或下一請求讀取 |
| 跨子域無法讀取 | Domain 未設為主域 | 設 COOKIE_DOMAIN => '.example.com' |
| 中文亂碼 | 未 URL 編碼 | ThinkPHP 內建處理,若手動 setcookie 需 urlencode |
| 刪除不生效 | Path/Domain 不一致 | 刪除時必須與設置時完全相同的 Path/Domain |
ThinkPHP cookie() 以單一函數涵蓋完整生命週期,支援陣列、前綴、多域配置,開箱即用。實務上建議:統一前綴、敏感資料加密簽名、善用 HTTPONLY/SECURE、跨域場景正確設定 Domain/Path,構建安全可靠的狀態管理體系。