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 数字左侧自动补0
Mar 31 PHP
php 前一天或后一天的日期
Jun 28 PHP
php递归列出所有文件和目录的代码
Sep 10 PHP
PHP安全技术之 实现php基本安全
Sep 04 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
Jun 28 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 PHP
php判断linux下程序问题实例
Jul 09 PHP
PHP Cookei记录用户历史浏览信息的代码
Feb 03 PHP
PHP静态成员变量和非静态成员变量详解
Feb 14 PHP
php 字符串中是否包含指定字符串的多种方法
Apr 12 PHP
PHP中number_format()函数的用法讲解
Apr 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无限级栏目分类读取的实现代码
2014/02/19 PHP
php修改指定文件后缀的方法
2014/09/11 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
jQuery选中select控件 无法设置selected的解决方法
2010/09/01 Javascript
javascript一些实用技巧小结
2011/03/18 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
axios 封装上传文件的请求方法
2018/09/26 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
[44:43]完美世界DOTA2联赛决赛日 FTD vs GXR 第一场 11.08
2020/11/11 DOTA
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
python+django+rest框架配置创建方法
2019/08/31 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
python实现智能语音天气预报
2019/12/02 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
纽约州一群才华横溢的金匠制作而成:Hearth Jewelry
2019/03/22 全球购物
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
自主招生英文自荐信
2015/03/25 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
党员转正党支部意见
2015/06/02 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android