Cookie 是瀏覽器存儲的少量數據(≤4KB),隨請求自動發送。包含名稱、值、過期時間、路徑、域、Secure/HttpOnly 標志。單域名限制 20 個。
<?php
// 推薦:setcookie() 自動構建 Set-Cookie 頭
// 必須在任何輸出前調用
setcookie("vegetable", "artichoke", time() + 3600, "/", ".example.com", true, true);
// 參數:名、值、過期時間戳、路徑、域、Secure、HttpOnly
// 讀取:$_COOKIE 超全局數組(僅包含當前請求攜帶的 Cookie)
if (isset($_COOKIE['vegetable'])) {
echo "歡迎回來,你選擇了: " . htmlspecialchars($_COOKIE['vegetable']);
}
<?php
// 設置過期時間為過去
setcookie("vegetable", "", time() - 3600, "/", ".example.com", true, true);
// 必須保持路徑、域、Secure 一致才能生效
Session 將數據存儲在服務端(默認文件),僅通過 session_id(Cookie 或 URL 傳遞)關聯客戶端。啟動:session_start()(必在輸出前)。數據存取:$_SESSION 超全局數組。
<?php
session_start();
// 存儲
$_SESSION['product1'] = 'Sonic Screwdriver';
$_SESSION['product2'] = 'HAL 2000';
// 讀取(任意頁面)
echo $_SESSION['product1'];
// 銷毀
session_destroy(); // 刪除服務端文件
$_SESSION = []; // 清空當前腳本數組
if (ini_get("session.use_cookies")) {
setcookie(session_name(), '', time()-42000, '/'); // 刪除 ID Cookie
}
商品選擇頁 (cart_add.php)
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['products'])) {
// 合併去重
$existing = $_SESSION['cart'] ?? [];
$new = array_unique(array_merge($existing, $_POST['products']));
$_SESSION['cart'] = $new;
echo "<p>商品已加入購物車!</p>";
}
?>
<form method="post">
<select name="products[]" multiple size="5">
<option value="Sonic Screwdriver">Sonic Screwdriver</option>
<option value="HAL 2000">HAL 2000</option>
<option value="Tardis">Tardis</option>
<option value="ORAC">ORAC</option>
</select>
<button type="submit">加入購物車</button>
</form>
<a href="cart_view.php">查看購物車</a>
購物車展示頁 (cart_view.php)
<?php
session_start();
echo "<h1>購物車</h1>";
if (!empty($_SESSION['cart'])) {
echo "<ol>";
foreach ($_SESSION['cart'] as $item) {
echo "<li>" . htmlspecialchars($item) . "</li>";
}
echo "</ol>";
} else {
echo "<p>購物車為空</p>";
}
?>
<a href="cart_add.php">繼續購物</a>
session.use_cookies=1, session.use_only_cookies=1(推薦,防 Session Fixation)。session.use_trans_sid=1 自動在鏈接附加 PHPSESSID=...,不推薦(暴露 ID、緩存污染)。實現 SessionHandlerInterface 或使用 session_set_save_handler() 將 Session 存入 Redis、MySQL、Memcached,實現集群共享。
session.cookie_httponly = 1 ; 防 JS 訪問
session.cookie_secure = 1 ; 僅 HTTPS(生產環境)
session.use_strict_mode = 1 ; 拒絕未初始化 ID
session.gc_maxlifetime = 1440 ; 垃圾回收壽命(秒)
session.save_path = "/var/lib/php/sessions" ; 確保權限正確