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 相关文章推荐
如何使用PHP中的字符串函数
Oct 09 PHP
php基础知识:类与对象(3) 构造函数和析构函数
Dec 13 PHP
如何提高MYSQL数据库的查询统计速度 select 索引应用
Apr 11 PHP
php结合飞信 免费天气预报短信
May 07 PHP
php的array_multisort()使用方法介绍
May 16 PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 PHP
ThinkPHP单字母函数(快捷方法)使用总结
Jul 23 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
May 12 PHP
PHP序列化操作方法分析
Sep 28 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
May 24 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
Jul 26 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
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
使用配置类定义Codeigniter全局变量
2014/06/12 PHP
php中JSON的使用与转换
2015/01/14 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
2015/09/16 Javascript
详细谈谈javascript的对象
2016/07/31 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
JavaScript实现10秒后再次获取验证码
2020/12/02 Javascript
Python调用C++程序的方法详解
2017/01/24 Python
Python 多进程和数据传递的理解
2017/10/09 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
Python常用的json标准库
2019/02/19 Python
Python实现搜索算法的实例代码
2020/01/02 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
电子商务专业个人的自我评价分享
2013/10/29 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
小平小道观后感
2015/06/09 职场文书
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers