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 相关文章推荐
[FAQ]PHP中的一些常识:类篇
Oct 09 PHP
PHP笔记之:基于面向对象设计的详解
May 14 PHP
实用的简单PHP分页集合包括使用方法
Oct 21 PHP
PHP callback函数使用方法和注意事项
Jan 23 PHP
php实现encode64编码类实例
Mar 24 PHP
php生成rss类用法实例
Apr 14 PHP
PHP生成及获取JSON文件的方法
Aug 23 PHP
php微信开发自定义菜单
Aug 27 PHP
PHP判断表达式中括号是否匹配的简单实例
Oct 22 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 PHP
php中错误处理操作实例分析
Aug 23 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
Oct 12 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
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
php实现session共享的实例方法
2019/09/19 PHP
Javascript 自定义类型方法小结
2010/03/02 Javascript
js 为label标签和div标签赋值的方法
2013/08/08 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
javascript实现下拉菜单效果
2021/02/09 Javascript
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
django fernet fields字段加密实践详解
2019/08/12 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
python利用platform模块获取系统信息
2020/10/09 Python
python math模块的基本使用教程
2021/01/16 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
animation和transition的区别
2020/10/12 HTML / CSS
简约控的天堂:The Undone
2016/12/21 全球购物
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
澳大利亚排名第一的露营和户外设备在线零售商:Outbax
2020/05/06 全球购物
高级编程求职信模板
2014/02/16 职场文书
关于保护环境的标语
2014/06/09 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
java解析XML详解
2021/07/09 Java/Android
关于HTML编码导致的乱码问题
2021/09/04 HTML / CSS