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 相关文章推荐
初学CAKEPHP 基础教程
Nov 02 PHP
PHP实现域名whois查询的代码(数据源万网、新网)
Feb 22 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
PHP中对缓冲区的控制实现代码
Sep 29 PHP
PHP中数组的分组排序实例
Jun 01 PHP
php cookie中点号(句号)自动转为下划线问题
Oct 21 PHP
smarty高级特性之对象的使用方法
Dec 25 PHP
php实现XML和数组的相互转化功能示例
Feb 08 PHP
thinkPHP5.0框架环境变量配置方法
Mar 17 PHP
PHP设计模式之装饰器模式定义与用法详解
Apr 02 PHP
PHP中__set()实例用法和基础讲解
Jul 23 PHP
php校验公钥是否可用的实例方法
Sep 17 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
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
php session应用实例 登录验证
2009/03/16 PHP
PHP+Ajax实时自动检测是否联网的方法
2015/07/01 PHP
原创javascript小游戏实现代码
2010/08/19 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
群众路线教育实践活动剖析材料
2014/09/30 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
交通事故代理词范文
2015/05/23 职场文书
贷款工资证明范本
2015/06/12 职场文书
公司档案管理制度
2015/08/05 职场文书
幼儿园语言教学反思
2016/02/23 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书
mysql sql常用语句大全
2022/06/21 MySQL
delete in子查询不走索引问题分析
2022/07/07 MySQL