深入分析PHP 刪除cookie教程

來源:互聯網
上載者:User


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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.