php 删除cookie方法详解

 更新时间:2014年12月01日 10:39:14   投稿:hebedich  
本文简单介绍了关于php删除cookie的方法,就是设置cookie有效期或者为空,非常实用的小技巧,这里推荐给大家。

我们先来看下相关cookie的机制。

复制代码 代码如下:

bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )

要删除cookie需要确保它的失效期是在过去,才能触发浏览器的删除机制。

下面的例子说明了如何删除刚才设置的cookie:

复制代码 代码如下:

<?php
//将过期时间设为一小时前
setcookie("TestCookie", "", time() - 3600);
setcookie("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);
?>

删除一个cookie的方法就是把这个cookie的有效期设置为当前时间以前,这也是几乎所有php程序员都会这么做。

后来一个初接触php的朋友告诉我,他在程序中本想把一个cookie的值设置为空,结果导致这个cookie直接被删除。我当时的第一反应是不相信,于是测试
了一下:

复制代码 代码如下:

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源码,终于发现真相(这就是开源的好处了,有什么不清楚的内幕,直接查源码)。

以下代码可以在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,当然这些手册中并没有。

是不是很简单呢,有时候我们还是非常有必要好好读读php源码的。

相关文章

  • php 生成WML页面方法详解

    php 生成WML页面方法详解

    WAP(无线通讯协议)是在数字移动电话、个人手持设备(PDA等)及计算机之间进行通讯的开放性全球标准。
    2009-08-08
  • php获得文件大小和文件创建时间的方法

    php获得文件大小和文件创建时间的方法

    这篇文章主要介绍了php获得文件大小和文件创建时间的方法,涉及php中filesize及fileatime函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • PHP析构函数destruct与垃圾回收机制的讲解

    PHP析构函数destruct与垃圾回收机制的讲解

    今天小编就为大家分享一篇关于PHP析构函数destruct与垃圾回收机制的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • php使用str_replace替换多维数组的实现方法分析

    php使用str_replace替换多维数组的实现方法分析

    这篇文章主要介绍了php使用str_replace替换多维数组的实现方法,结合具体实例对比分析了php针对多维数组的遍历与替换操作相关实现技巧与注意事项,需要的朋友可以参考下
    2017-06-06
  • PHP处理bmp格式图片的方法分析

    PHP处理bmp格式图片的方法分析

    这篇文章主要介绍了PHP处理bmp格式图片的方法,结合具体实例形式分析了PHP操作bmp格式图片的相关函数与使用技巧,需要的朋友可以参考下
    2017-07-07
  • WordPress主题制作之模板文件的引入方法

    WordPress主题制作之模板文件的引入方法

    这篇文章主要介绍了WordPress主题制作之模板文件的引入方法,针对get_template_part()函数的使用进行了讲解,需要的朋友可以参考下
    2015-12-12
  • mac下Apache + MySql + PHP搭建网站开发环境

    mac下Apache + MySql + PHP搭建网站开发环境

    最近接了个小活,做一个使用PHP语言和MySql数据库的动态网站。之前做过类型的网站,是在windows系统下做的,开发环境使用的是 AppServ 的PHP开发套件。现在有了我的大MAC,所以找了MAC系统下PHP环境的开发套件。
    2014-06-06
  • js+php实现静态页面实时调用用户登陆状态的方法

    js+php实现静态页面实时调用用户登陆状态的方法

    这篇文章主要介绍了js+php实现静态页面实时调用用户登陆状态的方法,采用在静态页面中使用js调用php页面从而实现用户登录状态的实时调用功能,需要的朋友可以参考下
    2015-01-01
  • PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)

    PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)

    这篇文章主要介绍了PHP查询并删除数据库多列重复数据的方法,利用数组函数实现该功能,涉及PHP数据库操作的相关技巧,需要的朋友可以参考下
    2016-02-02
  • PHP session反序列化漏洞超详细讲解

    PHP session反序列化漏洞超详细讲解

    这篇文章主要介绍了PHP session反序列化漏洞,php session反序列化漏洞存在的原因是当序列化session和读取反序列化字符时采用的序列化选择器不一样时,处理的方法不一样
    2023-02-02

最新评论