β

PHP中的cookie和session

老崔博客 162 阅读
PHP

我们使用电子商务网站进行购物时,当从一个页面跳转到另一个页面时,我们购物车里的商品依然存在。那么怎样使用PHP维护从一个页面到另一个页面的状态呢?

PHP主要有两种用于跟踪数据的方法:cookie和session.本文我们从如何创建,读取,修改和删除cookie入手,然后轻松掌握session, 更加有效的维护状态。

什么是cookie

在cookie出现之前,Web网站是没有历史可言的。虽然浏览器可以跟踪所访问的页面,允许使用后退按钮回到之前访问到的页面,并且使用不同的颜色标注已经访问过的链接,但是服务器并不会记录访问过什么内容。

为什么这会成为一个问题呢?如果服务器不能跟踪用户,将不能使用购物车进行在线购物。简言之,没有cookie就没有那么多有益的站点(或者至少不是现在这个样子)。

cookie是服务器在用户计算机上保存用户信息的一种方式,以便服务器能够在访问中或者多次访问中记住用户。cookie储存在浏览器中,但是只有最初发送cookie的站点才能够读取它。

可以使用Firebug来调试cookie , 打开Firebug选择Cookies选项卡,就可以开始调试cookie了:
Firebug调试cookie

创建cookie

理解cookie的一件重要的事情是:cookie必须在其他任何信息之前从服务器端发送到客户端。如果服务器在Web浏览器已经得到HTML代码之后发送cookie,甚至是一个无关紧要的空格,就会得到一个错误。注:关于这点,我在PHP5.5中测试结果是,cookie不必在其它信息之前发送到客户端,并且并不会引发错误。

使用函数 setcookie() 发送cookie:

setcookie(name, value);
setcookie('CookieName', 'This is the cookie value.');

这行代码向浏览器发送了一个名为”CookieName”的cookie, 其值为”This is the cookie value.”。
尽管向相同站点发送cookie的数量已经被Web浏览器所限制,不过还是可以用函数setcookie()继续向浏览器发送更多的cookie。

setcookie('name2', 'some value');
setcookie('name3', 'another value');

创建cookie时可以使用变量作为cookie的名称或值。

setcookie($cookie_name, $cookie_value);

读取cookie

就像表单数据储存在数组$_POST中(此时该表单使用POST方法),URL中传送给脚本的值被储存在数组$_GET中那样,函数setcookie()将cookie数据储存在数组$_COOKIE中。从cookie中获得某个值,只需将cookie名称指定为该数组的索引即可。例如获取下面脚本中创建的cookie值:

setcookie('name1', 'age1');

可以使用 $_COOKIE['name1'] .

向cookie添加参数

setcookie() 可以接受7个参数,但是只有name这个参数是必须的:

setcookie(name, value, expiration, path, domain, secure, httponly);

参数expiration起的作用是为cookie设定过期时间,通常情况下是当前时间加上指定的秒数来指定过期时间,使用PHP的time()函数来获取当前时间。下面的代码指定过期时间为当前时间之后的1个小时。

setcookie(name, value, time()+3600);

path和domain参数用来Web站点对cookie访问的路径和域:

setcookie(name, value, time()+3600, '', 'forum.example.com');

参数secure只有两个值0和1. 值1指明必须使用安全的HTTPS连接,反之0指明安全连接不必要。可以为一个电子商务网站确认一个安全cookie传输。
最后一个属性httponly是PHP5.2版本中新添加的属性。用于限制对cookie的访问(比如限制JavaScript读取cookie),但并不是所有的浏览器都提供支持。

和所有带有参数的函数一样,必须按照顺序传递参数值。如果不希望指定路径和域,需要使用空的引号,path参数,可以使用一个单独的斜线(/)表示跟目录。

删除cookie

虽然cookie会在用户关闭浏览器或者过期时间到期后自动过期,但是我们还是能够手动删除cookie. 例如,当用户注销账户时有时我们需要删除所有的cookie。

如果我们给函数setcookie()传送一个有名称但无值的cookie, 起的作用和删除一个已经存在的同名的cookie一样。例如下面的代码创建一个名为usename的cookie:

setcookie('usename', 'cui');

删除名为usename的cookie,可以编写代码

setcookie('usename', '');

或者

setcookie('usename', FALSE);

为了更加谨慎,也可以指定一个过去的过期时间

setcookie('usename', FALSE, time()-600);

需要注意的是删除cookie必须使用和设置cookie时相同的参数值(除了值和过期时间)。例如,如果在创建cookie提供了参数domain值,那么在删除该cookie的时候同样需要提供该参数:

setcookie('user', 'cui', time()+3600, '', 'ijs.me');
setcookie('user', '', time()-600, '', 'ijs.me');

什么是session

session是一种解决方案,就像是cookie,可以用来跟踪用户在一系列页面访问的数据。二者之间的重要区别在于,cookie是保存在客户端,而cookie保存在服务器端。session拥有比cookie更多的优势。

当开启一个session时,PHP会创建一个随机的session ID。每个用户的session都会有一个自己的session ID,与服务器上存储该用户的session数据的文件名是相同的。这个session ID将作为一个cookie发送给Web浏览器,见下图。接下来PHP页面将使用这个cookie来检索session ID并访问session信息。
session ID发送到浏览器

创建session

可以使用session_start()创建、访问、和删除session。这个函数将试图在session首次启动时发送一个cookie,因此它必须在任何HTML或空白被发送到Web浏览器之前调用。因此,在使用session的页面中,必须在脚本的起始行调用函数session_start();

<?php
session_start();

当第一次开启session时,会产生一个随机的session ID,并且会向Web浏览器发送一个名为PHPSESSION(session的名称)的cookie,它的值看上去类似于,k41plfg5dhun7dqh8ugi5euu68。

一旦启用了session,可以向数组$_SESSION赋值的方式记录数据:

$_SESSION['first_name'] = 'Cui';
$_SESSION['age'] = 3;

这个数组与PHP中使用的其它数组不同的是,它必须是关联数组。也就是必须使用字符串作为键,比如”first_name”和”age”。但可以在session中保存任何值,如数值,字符串,数组或者对象,甚至它们的任意组合。

每次这么做,PHP将向服务器上的一个临时文件中编写一些数据。

访问session变量

我们已经在session中保存了一些值,接下来我们怎样访问它们呢?不论是创建新的session,还是访问已经存在的session,都必须从函数 session_start() 开始。该函数向PHP指明这个脚本将要使用session。

引用session非常简单,和引用其它数组的操作差不多,下面我们引用在上一节中创建的session:

<?php
session_start();
$_SESSION['first_name'];
$_SESSION['age'];

注意:
* 可以使用isset($_SESSION[‘var’])来查看特定的session值是否存在,就像用来检验其它的变量是否被设置那样。
* 在session中,数据永远以纯文本的形式保存在一个开放可读的文本文件中。所以不要将真实的敏感信息存在session中,如信用卡数据。
* 要提高数据的安全性,可以将数据加密后再保存到session中,在读取session后再将其解密。这需要使用Mcrypt库和其它的一些高级PHP知识。

删除session

知道如何删除session是非常重要的,就像知道如何删除session一样重要:有时候需要删除已经保存的session数据。session数据在两个地方存在,因此需要在两个地方进行删除操作。但是首先必须从函数session_start()开始。然后在设置数组$_SESSION来删除session值,最后需要从服务器上删除session数据(保存在临时文件中),可以通过下面这样的方式操作:

session_start();
$_SESSION = array();
session_destroy();

可以使用 unset($_SESSION['var']) 来删除一个单独的session值。

cookie和session如何选择

尽管session和cookie相比有很多优势,但是在一些情况下仍需使用cookie。cookie在一下方面相比session更具优势:

简言之,在对安全问题要求不是那么高,并且只有少量的数据需要储存时要使用cookie。如果需要考虑安全问题,并且有大量的信息需要保存,最好使用session。

PHP
作者:老崔博客
岁月如歌,代码如诗
原文地址:PHP中的cookie和session, 感谢原作者分享。

发表评论