php 删除cookie方法详解


Posted in PHP onDecember 01, 2014

我们先来看下相关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 相关文章推荐
PHP5 安装方法
Oct 09 PHP
聊天室php&amp;mysql(一)
Oct 09 PHP
一些PHP写的小东西
Dec 06 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
Jun 04 PHP
php错误、异常处理机制(补充)
May 07 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
Jun 05 PHP
深入PHP nl2br()格式化输出的详解
Jun 05 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
PHP加密函数 Javascript/Js 解密函数
Sep 23 PHP
php根据指定位置和长度获得子字符串的方法
Mar 17 PHP
PHP判断一个变量是否为整数、正整数的方法示例
Sep 11 PHP
Laravel框架源码解析之入口文件原理分析
May 14 PHP
php生成html文件方法总结
Dec 01 #PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
Dec 01 #PHP
php中随机函数mt_rand()与rand()性能对比分析
Dec 01 #PHP
THINKPHP项目开发中的日志记录实例分析
Dec 01 #PHP
PHP内置的Math函数效率测试
Dec 01 #PHP
php查找字符串出现次数的方法
Dec 01 #PHP
ThinkPHP实现动态包含文件的方法
Nov 29 #PHP
You might like
56.com视频采集接口程序(PHP)
2007/09/22 PHP
PHP5+UTF8多文件上传类
2008/10/17 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
javascript事件模型介绍
2016/05/31 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
js动态引入的四种方法
2018/05/05 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[01:16:28]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第二场 2月23日
2021/03/11 DOTA
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
详解Python传入参数的几种方法
2019/05/16 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
python绘制汉诺塔
2021/03/01 Python
详解css3中 text-fill-color属性
2019/07/08 HTML / CSS
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
技校毕业生自荐信
2014/06/03 职场文书
合作协议书范文
2014/08/20 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
工作收入证明模板
2015/06/12 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书