要刪除 cookie 需要確保它的失效期是在過去,才能觸發瀏覽器的刪除機制
在php中,我們可以使用setcookie()函數來設定瀏覽器的Cookie資訊。
常見的設定cookie的範例程式碼如下:
<?php
$name = 'mycookie'; // cookie名稱
$value = 'CodePlayer'; // cookie值
$expire = time() + 3600 * 24 * 7; // 到期時間 7天
$path = '/'; // 設定可以使用該cookie的路徑,'/'表示網站根目錄,該目錄及所有子目錄中均可訪問該cookie。
// 設定一個cookie
setcookie( $name, $value, $expire, $path );
?>
不過,我們想要刪除Cookie資訊的話,又該怎麼辦呢。php並沒有提供另外一個專門用來刪除Cookie的函數,而是直接使用setcookie()函數來刪除Cookie資訊,我們只需要將到期時間更改為目前時間之間的時間即可。
<?php
// 設定cookie已到期,瀏覽器即可刪除該cookie。此時可以為任意值。
setcookie( 'mycookie', 'CodePlayer', time() - 3600, '/' );
// 或者
// 將到期時間直接設為0,表示1970-1-1(已經到期了),可以避免time()及數學運算的消耗
setcookie( 'mycookie', 'CodePlayer', 0, '/' );
?>
此外,我們還可以將Cookie的值設為空白字串(“”)或null,也可用來刪除Cookie。
<?php
/* 刪除cookie */
setcookie('mycookie', '');
// 或者
setcookie('mycookie', null);
?>
這樣就完了嗎?No!如果你直接如上使用Null 字元串或null的方式來刪除Cookie,可能會導致對應的cookie無法刪除。
當然,上述刪除Cookie的方式是沒有錯的,錯的是我們沒有在刪除Cookie時指定路徑(第4個參數)。如果沒有指定路徑參數,則路徑預設為當前請求URL所在目錄。如果你設定Cookie時的路徑與刪除Cookie時的路徑不一致,將無法刪除該Cookie。
<?php
// 當前請求為:"/abc/cookie.php"
// 在路徑"/"下設定cookie
setcookie( 'mycookie', 'CodePlayer', time() + 3600 * 24 * 7, '/' );
// 注意:這樣刪除是無效的,因為預設路徑為目前的目錄,即:"/abc/"
// setcookie( 'mycookie', '');
// 刪除路徑"/"下設定的名為"mycookie"的cookie,此時時間值可隨意,哪怕未到期也行
setcookie( 'mycookie', '', 0, '/');
?>
以下代碼可以在php5.20的linux源碼包中ext/standard/head.c第99行附近找到.
if (value && value_len == 0) {
/*
* MSIE doesn't delete a cookie when you set it to a null value
* so in order to force cookies to be deleted, even on MSIE, we
* pick an expiry date 1 year and 1 second in the past
*/
time_t t = time(NULL) - 31536001;
dt = php_format_date("D, d-M-Y H:i:s T", sizeof("D, d-M-Y H:i:s T")-1, t, 0 TSRMLS_CC);
sprintf(cookie, "Set-Cookie: %s=deleted; expires=%s", name, dt);
efree(dt);
} else {
sprintf(cookie, "Set-Cookie: %s=%s", name, value ? encoded_value : "");
if (expires > 0) {
strcat(cookie, "; expires=");
dt = php_format_date("D, d-M-Y H:i:s T", sizeof("D, d-M-Y H:i:s T")-1, expires, 0 TSRMLS_CC);
strcat(cookie, dt);
efree(dt);
}
}
源碼中清清楚楚的顯示,if (value && value_len == 0) ,當value_len為0
時
sprintf(cookie, "Set-Cookie: %s=deleted; expires=%s", name, dt);
會發送刪除cookie的http頭給瀏覽器.
最後我們可以得出結論,在php中使用
setcookie($cookiename, '');或者 setcookie($cookiename, NULL);
都會刪除cookie,當然這些手冊中並沒有。