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操作Access类(PHP+ODBC+Access)
Jan 02 PHP
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
一个简洁的PHP可逆加密函数(分享)
Jun 06 PHP
PHP入门经历和学习过程分享
Apr 11 PHP
ThinkPHP CURD方法之data方法详解
Jun 18 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
php检查日期函数checkdate用法实例
Mar 19 PHP
php时间计算相关问题小结
May 09 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 PHP
php+redis消息队列实现抢购功能
Feb 08 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随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
window.parent与window.openner区别介绍
2012/04/12 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
Python 命令行参数sys.argv
2008/09/06 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
如何基于python实现脚本加密
2019/12/28 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
材料物理专业大学毕业生求职信
2013/10/15 职场文书
小学生操行评语大全
2014/04/22 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
工地安全质量标语
2014/06/07 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
工作收入证明模板
2014/10/10 职场文书
入党培养人考察意见
2015/06/08 职场文书
酒店宣传语大全
2015/07/13 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
Python入门之基础语法详解
2021/05/11 Python
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript