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 相关文章推荐
require(),include(),require_once()和include_once()的异同
Jan 02 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
Nov 01 PHP
php中神奇的fastcgi_finish_request
May 02 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
将FCKeditor导入PHP+SMARTY的实现方法
Jan 15 PHP
PHP编译安装时常见错误解决办法
May 28 PHP
Yii2 RESTful中api的使用及开发实例详解
Jul 06 PHP
PHP购物车类Cart.class.php定义与用法示例
Jul 20 PHP
Linux下快速搭建php开发环境
Mar 13 PHP
thinkPHP5框架自定义验证器实现方法分析
Jun 11 PHP
PHP模版引擎原理、定义与用法实例
Mar 29 PHP
thinkphp5 模型实例化获得数据对象的教程
Oct 18 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
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
2013/04/23 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
js实现二级联动简单实例
2020/01/11 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
Python 随机生成中文验证码的实例代码
2013/03/20 Python
Python简单实现enum功能的方法
2016/04/25 Python
Random 在 Python 中的使用方法
2018/08/09 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
python实现逻辑回归的示例
2020/10/09 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
标记环介质访问控制协议
2016/03/27 面试题
实习会计求职自荐信范文
2014/03/10 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
Ajax异步刷新功能及简单案例
2021/11/20 Javascript
如何通过cmd 连接阿里云服务器
2022/04/18 Servers