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.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
php 如何获取数组第一个值
Aug 06 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
May 08 PHP
浅析php创建者模式
Nov 25 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
PHP让数组中有相同值的组成新的数组实例
Dec 31 PHP
PHP children()函数讲解
Feb 03 PHP
PHP中“=&gt;
Mar 01 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 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
第一个无线电台是由谁发明的
2021/03/01 无线电
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
thinkphp 框架数据库切换实现方法分析
2020/05/18 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
jQuery UI设置固定日期选择特效代码分享
2015/08/27 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
vue多次循环操作示例
2019/02/08 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
python 实现A*算法的示例代码
2018/08/13 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
使用python os模块复制文件到指定文件夹的方法
2019/08/22 Python
python高级特性简介
2020/08/13 Python
python 调整图片亮度的示例
2020/12/03 Python
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
俞敏洪励志演讲稿
2014/04/29 职场文书
个人担保书格式范文
2014/05/12 职场文书
销售提升方案
2014/06/07 职场文书
会议室标语
2014/06/21 职场文书
环卫工作汇报材料
2014/10/28 职场文书
刑事上诉状范文
2015/05/22 职场文书
肖申克救赎观后感
2015/06/02 职场文书
队名及霸气口号大全
2015/12/25 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS