冰楓論壇

標題: 深入分析PHP 刪除cookie教程 [打印本頁]

作者: silverair    時間: 2015-6-28 02:38
標題: 深入分析PHP 刪除cookie教程
cookie是一個存儲在用戶本地的一個小的文本文件了我們可以通過瀏覽器來訪問它,下面我們來看看關於PHP 刪除cookie的一些事項。

要刪除 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的方式來刪除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,當然這些手冊中並沒有。




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓