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 Header用于页面跳转要注意的几个问题总结
Oct 03 PHP
PHP session会话的安全性分析
Sep 08 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
PHP实现设计模式中的抽象工厂模式详解
Oct 11 PHP
PHP实现的DES加密解密实例代码
Apr 06 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
PHP session 会话处理函数
Jun 06 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
PHP实现获取url地址中顶级域名的方法示例
Jun 05 PHP
php写入mysql中文乱码的实例解决方法
Sep 17 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
Oct 11 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加速 eAccelerator配置和使用指南
2009/06/05 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
php采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
php验证手机号码
2015/11/11 PHP
javawscript 三级菜单的实现原理
2009/07/01 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
JavaScript中常用的验证reg
2016/10/13 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
Vue基础学习之项目整合及优化
2019/06/02 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
Python标准库itertools的使用方法
2020/01/17 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
python except异常处理之后不退出,解决异常继续执行的实现
2020/04/25 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
杰夫·班克斯男士服装网上商店:Jeff Banks
2019/10/24 全球购物
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
社区学雷锋活动策划方案
2014/01/30 职场文书
爱国演讲稿400字
2014/05/07 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
财务工作失职检讨书
2014/11/21 职场文书
农村老人去世追悼词
2015/06/23 职场文书
python实现学生信息管理系统(面向对象)
2022/06/05 Python