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 相关文章推荐
Zend引擎的发展 [15]
Oct 09 PHP
亲密接触PHP之PHP语法学习笔记1
Dec 17 PHP
php下实现农历日历的代码
Mar 07 PHP
php mssql 时间格式问题
Jan 13 PHP
PHP 替换模板变量实现步骤
Aug 24 PHP
如何使用PHP计算上一个月的今天
May 23 PHP
php获取url参数方法总结
Nov 13 PHP
PHP中mysqli_affected_rows作用行数返回值分析
Dec 26 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
Apr 27 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 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学习之数据类型之间的转换代码
2011/05/29 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
php提取字符串中网站url地址的方法
2014/12/03 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
Code:findPosX 和 findPosY
2006/12/20 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
2013/08/13 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
vue axios post发送复杂对象问题
2019/06/04 Javascript
JS回调函数深入理解
2019/10/16 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
python创建文本文件的简单方法
2020/08/30 Python
python获取linux系统信息的三种方法
2020/10/14 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
德国高性价比网上药店:medpex
2017/07/09 全球购物
创建市级文明单位实施方案
2014/03/01 职场文书
学历公证委托书
2014/04/09 职场文书
请假条怎么写
2014/04/10 职场文书
经营目标管理责任书
2014/07/25 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
使用kubeadm命令行工具创建kubernetes集群
2022/03/31 Servers