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 相关文章推荐
Windows下利用Gvim写PHP产生中文乱码问题解决方法
Apr 20 PHP
PHP中通过语义URL防止网站被攻击的方法分享
Sep 08 PHP
PHP插入排序实现代码
Apr 04 PHP
PHP $_FILES中error返回值详解
Jan 30 PHP
thinkphp使用literal防止模板标签被解析的方法
Nov 22 PHP
php rsa加密解密使用详解
Jan 14 PHP
学习php设计模式 php实现命令模式(command)
Dec 08 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
功能强大的PHP POST提交数据类
Jul 15 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
Nov 04 PHP
php和asp语法上的区别总结
May 12 PHP
redis+php实现微博(二)发布与关注功能详解
Sep 23 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
截获网站title标签之家内容的例子
2006/10/09 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
如何通过js实现图片预览功能【附实例代码】
2016/03/30 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
npm国内镜像 安装失败的几种解决方案
2017/06/04 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
浅谈python中get pass用法
2019/03/19 Python
如何用C代码给Python写扩展库(Cython)
2019/05/17 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
违反校纪校规检讨书
2014/02/15 职场文书
大学信息公开实施方案
2014/03/09 职场文书
爱心捐款倡议书
2014/04/14 职场文书
公司采购主管岗位职责
2014/06/17 职场文书
个人主要事迹材料
2014/08/26 职场文书
货款欠条范本
2015/07/03 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang
Django实现聊天机器人
2021/05/31 Python
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python