深入分析PHP 删除cookie教程

cookie是一个存储在用户本地的一个小的文本文件了我们可以通过浏览器来访问它,下面我们来看看关于PHP 删除cookie的一些事项。

要删除 cookie 需要确保它的失效期是在过去,才能触发浏览器的删除机制

在php中,我们可以使用setcookie()函数来设置浏览器的Cookie信息。

常见的设置cookie的示例代码如下:

  1. <?php
  2. $name = 'mycookie'; // cookie名称
  3. $value = 'CodePlayer'; // cookie值
  4. $expire = time() + 3600 * 24 * 7; // 过期时间 7天
  5. $path = '/'; // 设置可以使用该cookie的路径,'/'表示站点根目录,该目录及所有子目录中均可访问该cookie。
  6. //phpfensi.com
  7. // 设置一个cookie
  8. setcookie( $name, $value, $expire, $path );
  9. ?>

不过,我们想要删除Cookie信息的话,又该怎么办呢。php并没有提供另外一个专门用来删除Cookie的函数,而是直接使用setcookie()函数来删除Cookie信息,我们只需要将过期时间更改为当前时间之间的时间即可。

  1. <?php
  2. // 设置cookie已过期,浏览器即可删除该cookie。此时可以为任意值。
  3. setcookie( 'mycookie', 'CodePlayer', time() - 3600, '/' );
  4. // 或者
  5. // 将过期时间直接设为0,表示1970-1-1(已经过期了),可以避免time()及数学运算的消耗
  6. setcookie( 'mycookie', 'CodePlayer', 0, '/' );
  7. ?>

此外,我们还可以将Cookie的值设为空字符串(“”)或null,也可用来删除Cookie。

  1. <?php
  2. /* 删除cookie */
  3. setcookie('mycookie', '');
  4. // 或者
  5. setcookie('mycookie', null);
  6. ?>

这样就完了吗?No!如果你直接如上使用空字符串或null的方式来删除Cookie,可能会导致对应的cookie无法删除。

当然,上述删除Cookie的方式是没有错的,错的是我们没有在删除Cookie时指定路径(第4个参数)。如果没有指定路径参数,则路径默认为当前请求URL所在目录。如果你设置Cookie时的路径与删除Cookie时的路径不一致,将无法删除该Cookie。

  1. <?php
  2. // 当前请求为:"/abc/cookie.php"
  3. // 在路径"/"下设置cookie
  4. setcookie( 'mycookie', 'CodePlayer', time() + 3600 * 24 * 7, '/' );
  5. // 注意:这样删除是无效的,因为默认路径为当前目录,即:"/abc/"
  6. // setcookie( 'mycookie', '');
  7. // 删除路径"/"下设置的名为"mycookie"的cookie,此时时间值可随意,哪怕未过期也行
  8. setcookie( 'mycookie', '', 0, '/');
  9. ?>

以下代码可以在php5.20的linux源码包中ext/standard/head.c第99行附近找到.

  1. if (value && value_len == 0) {
  2. /*
  3. * MSIE doesn't delete a cookie when you set it to a null value
  4. * so in order to force cookies to be deleted, even on MSIE, we
  5. * pick an expiry date 1 year and 1 second in the past
  6. */
  7. time_t t = time(NULL) - 31536001;
  8. 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);
  9. sprintf(cookie, "Set-Cookie: %s=deleted; expires=%s", name, dt);
  10. efree(dt);
  11. } else {
  12. sprintf(cookie, "Set-Cookie: %s=%s", name, value ? encoded_value : ""); //phpfensi.com
  13. if (expires > 0) {
  14. strcat(cookie, "; expires=");
  15. 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);
  16. strcat(cookie, dt);
  17. efree(dt);
  18. }
  19. }

源码中清清楚楚的显示,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,当然这些手册中并没有。