冰楓論壇

 找回密碼
 立即註冊
查看: 695|回覆: 0

[心得] 深入分析PHP 刪除cookie教程

  [複製鏈接]

33

主題

0

好友

34

積分

新手上路

Rank: 1

UID
62810
帖子
64
主題
33
精華
0
積分
34
楓幣
2948
威望
32
存款
0
贊助金額
0
推廣
0
GP
32
閱讀權限
10
性別
保密
在線時間
41 小時
註冊時間
2014-5-26
最後登入
2019-5-7
發表於 2015-6-28 02:38:05 |顯示全部樓層
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,當然這些手冊中並沒有。
[發帖際遇]: silverair 去動物園看支那賤畜,購買動物園票劵 1 楓幣. 幸運榜 / 衰神榜
您需要登入後才可以回帖 登入 | 立即註冊

正在連接伺服器...
打開冰楓聊天室
廣告刊登意見回饋關於我們職位招聘

Copyright © 2011-2019 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|意見反饋|手機版|Archiver|冰楓論壇

GMT+8, 2019-7-22 12:02

APP Store下載 Play Store下載
回頂部