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 相关文章推荐
珊瑚虫IP库浅析
Feb 15 PHP
php 前一天或后一天的日期
Jun 28 PHP
php 数组使用详解 推荐
Jun 02 PHP
php中转义mysql语句的实现代码
Jun 24 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
微信扫描二维码登录网站代码示例
Dec 30 PHP
ThinkPHP模板IF标签用法详解
Jul 01 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
Apr 08 PHP
修复ShopNC使用QQ 互联时提示100010 错误
Nov 08 PHP
基于PHP实现商品成交时发送短信功能
May 11 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
PHP strripos函数用法总结
Feb 11 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
php disk_free_space 返回目录可用空间
2010/05/10 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
jquery图片上下tab切换效果
2011/03/18 Javascript
了解一点js的Eval函数
2012/07/26 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
jQuery功能函数详解
2015/02/01 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
JS中的phototype详解
2017/02/04 Javascript
js实现4个方向滚动的球
2017/03/06 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
详解微信UnionID作用
2019/05/15 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
python Django框架实现自定义表单提交
2016/03/25 Python
Python与Java间Socket通信实例代码
2017/03/06 Python
python实现微信小程序自动回复
2018/09/10 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
英国高级健康和美容产品零售商:Life and Looks
2019/08/01 全球购物
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
abstract class和interface有什么区别
2013/08/04 面试题
新文化运动的口号
2014/06/21 职场文书
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
2015年测量员工作总结
2015/05/23 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
vue中 this.$set的使用详解
2021/11/17 Vue.js
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers