phpクッキー削除方法の詳細

2665 ワード

まずクッキーに関するメカニズムを見てみましょう.
 
  
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )

クッキーを削除するには、ブラウザの削除メカニズムをトリガーする前に、その失効期間が過去であることを確認する必要があります.
次の例では、さっき設定したクッキーを削除する方法を示します.
 
  
//
setcookie("TestCookie", "", time() - 3600);
setcookie("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);
?>

クッキーを削除する方法は、このクッキーの有効期間を現在の時間に設定することです.これもほとんどのphpプログラマーがそうします.
その後、phpに初めて触れた友达は、プログラムの中でクッキーの値を空に設定しようとしたが、その結果、このクッキーが直接削除されたと教えてくれた.私の最初の反応は信じられなかったので、テストしました.
 
  
setcookie("testcookie", '');
print_r($_COOKIE);

結果はやっぱり全体$COOKIE配列はすべて空で、$_だけではありませんCOOKIE['testcookie']が空です.そこでwinsockでバッグをつかみ、戻ってきたhttpヘッダを観察すると、httpヘッダが「Set-Cookie:testcookie=deleted;expires=Mon,18-Jun-2007 02:42:33 GMT」であることがわかり、これは「setcookie("testcookie");」確かにtestcookieというcookieを直接削除したが、phpマニュアルでは全く説明されていない.
最後にphpソースを読んで、やっと真相を発見しました(これがオープンソースのメリットで、何か分からない内幕があったら、直接ソースコードを調べます).
以下のコードはphp 5.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);」クッキーを削除するhttpヘッダがブラウザに送信されます.
最後にphpで「setcookie($cookiename,')」を使用すると結論できます.または「setcookie($cookiename,NULL);」クッキーは削除されますが、もちろんこれらのマニュアルにはありません.
簡単ではないでしょうか.phpソースをよく読む必要があることがあります.