星期一, 十月 01, 2007

翻译:PHP和Session终极指南 III

原 文:PHP and Sessions, the ultimate guide!
原文作者:Deian Motov
发布日期:Sunday, 30 September 2007
译 者:石头希迁

游戏规则
session使用in-memory cookie,这就解释了为什么只在创建这个cookie的浏览器没有关闭的时候这个cookie才是可得的。一旦这个客户端浏览器关闭了,浏览器占用的内存就会释放,交还给系统,也销毁了会话的cookie。如果想要cookie生存时期更长,可以使用PHP的内建cookie函数将cookie写入用户的磁盘文件,需要的时候再读出此数据。

在我们开始使用cookie前,有以下问题需要注意:
  1. 因为cookie是用来记录你在某个特点的域的活动的,因此只有创建cookie的域才能读它;
  2. 一个域最多只能设置20个cookie,而且每个cookie最大尺寸不能超过4 KB;
  3. 一个cookie通常处理6个属性,其中只有第一个是强制的,它们是:
  • name:cookie的名字
  • value:cookie的值
  • expires:cookie过期的日期和时间
  • path:域(damain)中能够访问cookie的顶极目录
  • domain:指定的域
  • secure:一个boolean标志,用来确定这个cookie是否只能够通过安全HTTP连接来传输
关于cookie的更多的信息可以从Netscape得到,他们是cookie最初的发明者。访问连接 http://wp.netscape.com/newsref/std/cookie_spec.html (译注:原文的网址链接不上)可以看到Netscape的cookie标准。

需要记住的是,因为cookie是存储在用户的硬盘里的,开发者仅仅永远微弱的控制能力。如果用户在其浏览器中关掉了cookie,则开发者设置的cookie是无法保存在客户端的。因此,每个开发者都要避免过分依赖cookie,设计一套在无法从用户端获得cookie数据时的后备方案。

有了上面这些警告和说明,让我们来看看一些简单用PHP处理cookie的例子吧。

又见老友


PHP提供了很唯一一个cookie操作函数:setcookie()。这个函数允许开发者读写cookie文件。下面的例子给出了演示。
<?php

if (!isset($_COOKIE['visited'])) {
// if a cookie does not exist
// set it
setcookie("visited", "1", mktime()+86400, "/") or die("Could not set cookie");
echo "This is your first visit here today.";
}
else {
// if a cookie already exists
echo "Nice to see you again, old friend!";
}

?>
想知道它是如何工作的,请求上面的网页多次。第一次,因为cookie还没有被设置,网页将会显示第一个消息。在接下来的访问中,因为cookie已经被设置,客户端将会被人出来,这样,网页将会第二条消息。注意,即使你关闭了你的浏览器,当你在打开浏览器再访问这个页面时,上面说道的那些还是会工作----这和上面提到的session的工作例子很不同。

setcookie()函数接收六个参数,cookie的名字、它的值、过期的日期、域、服务器端能个使设置cookie有效的顶极路径和指定安全状态的Boolean值。只有namevalue是必需的(译注:value可以为缺省的值)----虽然上面的例子中,指定了top-level目录,以及通过mktime()函数设置了过期日期(一天)。mktime()和上面提到的time()函数类似。

Cookie值是由客户端自动送到服务器的PHP脚本的,将会转化为key-value对,填充到$_COOKIE变量,$_COOKIE是一个superglobal数组,和$_SESSION类似。如上面的例子所示,其值可以通过通常的数组访问方法得到。注意,同在sessions中一样,setcookie()也必须在脚本有任何输出之前调用,否则,会出现如下的警告:
Warning: Cannot add header information - headers already sent by (output started at ... )

没有评论: