PHP中Cookie的创建、读取与删除指南
在PHP Web开发中,利用 setcookie() 函数设置和读取Cookie是一项极其重要且实用的操作。本文通过具体代码演示了如何创建、修改有效期、控制访问权限以及如何正确删除Cookie,并特别强调了关于HTTP请求头的关键注意事项。
设置与读取Cookie的基础
在PHP中,可以使用内置的 setcookie() 函数来创建和修改Cookie。该函数的使用方式非常直观,最简单的用法只需传递Cookie的名称和值:
<?php
setcookie('name', 'bret');
?>
在上述代码执行后,名为 name 的Cookie值被设置为“bret”。由于未指定过期时间,这将被视为一个“Session Cookie”(会话Cookie),即仅在当前浏览器会话期间有效。当用户关闭浏览器时,该Cookie会自动清除。
要在后续页面中读取这个Cookie的值,PHP会自动将其放入超级全局数组 $_COOKIE 中。例如,可以通过以下方式访问它:
<?php
if(isset($_COOKIE['name'])) {
$name = $_COOKIE['name']; // 值为 'bret'
} else {
$name = 'Guest';
}
echo "Welcome, $name";
?>
自定义Cookie有效期
如果需要让Cookie在用户关闭浏览器后依然保留(持久化Cookie),则需要为 setcookie() 设置第三个参数,即过期时间。在PHP中,这个时间必须是一个Unix时间戳(从1970年1月1日起算的总秒数)。
虽然可以直接计算秒数,但推荐使用 mktime() 函数来生成时间戳。其参数顺序依次为:小时、分钟、秒、月份、日期、年份。
<?php
// 设定过期时间为2000年1月1日 00:00:00
$y2k = mktime(0, 0, 0, 1, 1, 2000);
setcookie('name', 'bret', $y2k);
?>
更新已存在的Cookie
若要更新某个Cookie的值,只需要再次调用 setcookie(),传入相同的名称和新值即可。需要注意的是,新值的生效依赖于当前的页面逻辑:
<?php
$name = 'jeff';
$y2k = mktime(0, 0, 0, 1, 1, 2000);
setcookie('name', $name, $y2k);
?>
上述操作将设置一个新的Cookie。如果希望当前页面的变量也能同步变更,必须在代码中显式赋值,因为Cookie实际上是在下一个HTTP请求中才能反映出新值(除非在本页面立即覆盖全局变量)。
控制Cookie的路径与域名
setcookie() 的第4个参数用于设置Cookie的可用目录路径,第5个参数用于设置Cookie的关联域名。这两项主要用于解决安全问题及跨站点/子目录的数据共享需求。
- 默认行为:如果不指定,Cookie仅能由当前发出请求的目录及其子目录访问,且只能由同一域名下的服务器读取。
- 跨子目录共享:假设你有一个账号位于 “www.domain.com”,同时也在 “other.domain.com” 上拥有处理权限,并且页面位于 “~/myhome” 目录下。你可以这样设置:
<?php
// 设置Cookie适用于整个 .domain.com 域名下的 ~/myhome 目录及子目录
setcookie('name', 'jeff', $y2k, '/~/myhome', '.domain.com');
?>
启用安全传输(HTTPS)
为了确保Cookie不通过不安全的明文协议(如HTTP)传输,可以设置 setcookie() 的第六个参数。将其设为 1 后,该Cookie只会在使用SSL(HTTPS)连接的安全服务器上被发送:
<?php
setcookie('secure_name', 'value', time()+3600, '/', '.example.com', 1);
?>
删除Cookie
删除Cookie的操作非常简单。只需向 setcookie() 传入需要删除的Cookie名称,并将过期时间设置为过去的时间点(通常直接传空字符串或使用旧的时间戳)即可让浏览器立即清除它:
<?php
// 最常用的删除方式:不传值,仅传名称,或手动设置过期时间为过去
setcookie('name', '', time()-1);
// 或者在某些情况下只传名称:
// setcookie('name', null);
?>
关键注意事项:输出顺序
在使用PHP操作Cookie时,最重要的一条规则是:必须在发送任何文本或HTML标签之前设置Cookie。
这是因为Cookie是通过HTTP响应头(Response Header)发送给浏览器的。一旦PHP开始输出主体内容(即使是空格或警告信息),响应头就已经发送完毕,此时再尝试调用 setcookie() 会导致错误,且Cookie不会被成功创建。
- 正确的做法:在输出语句之前执行
setcookie()。
<?php
// 先设置Cookie
setcookie('name', 'jeff');
// 然后再输出内容
echo "Hello Everyone!";
?>
- 错误的做法:先有输出(如
date()返回的字符串),随后再尝试设置Cookie。
<?php
// 这一步已经开始输出了
$today = mktime(12, 0, 0, 6, 25, 1999);
echo date('g:i:s a, F d, Y', $today);
// 下面这行将无法生效,甚至可能引发警告
setcookie('name', 'jeff', $today);
?>
此外,如果在 php.ini 开启了 display_errors,这种输出错误有时会被转换为“Headers already sent”的严重警告,因此在调试此类问题时需格外留意代码首部的空白字符。
总结
综上所述,掌握PHP中的Cookie主要依赖于理解 setcookie() 函数及其参数的含义,特别是过期时间的Unix时间戳转换、作用域的控制以及严格的HTTP头部优先原则。合理使用这些功能可以实现高效的网站个性化配置和用户状态保持。
以上就是PHP中Cookie的创建、设置与读取的详细使用方法,更多关于PHP基础技术的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













