技术开发 频道

PHP 开发经典教程 (Part 4):会话管理

【IT168 专稿】耐心自付

既然你已经结合MySQL和SQLite使用PHP了,那么你可能会认为你已经知道了PHP编程所需的一切。实际上,你或许甚至一直在思考减少对Zend.com的访问,同时为了一些更炫和更酷的事情而放弃该系列教程的学习……

恩,大错特错。

你看,虽然内建的数据库支持使得使用PHP编程容易,但它并不是唯一的使得PHP如此受欢迎的原因。易于使用的XML API和新的异常处理机制(PHP 5中)、可插入模块的支持以及内建的session管理只是使得PHP震撼的许多其他特征中的一部分。而且如果你能自己发现所有这些能力并在那儿多逗留一会儿,那么PHP的所有的这些能力都将在这个系列教程里面被系统的深入研究。所以,请闭上你的眼睛,深呼吸然后继续阅读以发现本教程的所有主题:sessions和cookies。

聚会时间

也许你在你最近去过的派对上听说过这个:“HTTP是一个无状态协议,且互联网是一个无状态的开放环境”。

没有,恩,很明显,你没有去对地方。

简单来讲,上面的含义就是HTTP这种超文本传输协议是Web的中枢,它无法保持已连接到Web站点的每个客户的身份的记忆,因而将一个页面的每次请求作为唯一和独立的连接对待,而与之前的无论什么连接都没有关系。只要你漫无目的的在网上冲浪,那么这个“无状态环境”就会工作的很好,但它会对那些依赖之前请求所积累的数据的站点带来一个非常头痛的问题。最常见的例子就是一个在线购物车(在无状态环境下,当你从一个目录页面跳到另外一个时,明了你购物简单列表的所有条目会变得困难)。

那么,明显地,所需要的是一种使得“维护状态”变得可能的方法,该方法允许客户端连接被跟踪而且特定的连接数据得到维护。因而产生了cookies,cookies允许Web站点在客户端系统存储客户端的特定信息而且在无论何时需要的时候访问该信息。一个cookie只是一个文件,它包含一系列的变量-值对而且连接到某个域上。当客户端请求一个特定域时,该cookie文件中的值被读取然后导入到服务器环境中,在该环境中,开发者可以为不同的目的而读取、修改和使用这些值。Cookie是一种将数据从一次客户端访问带到下一次访问的简便方法。

另外一种常见的方法就是使用session来存储连接特定的数据;该session数据在访问期间被保存在服务器端,且在访问结束后就被销毁。Session通过为每个Session关联一个由PHP自动产生的SessionID号(该Session唯一的标识符)而工作。该SessionID被保存在两个位置中:在使用临时cookie的客户端上和在服务器上的普通文件或者数据库中。通过使用SessionID来给每个接受的请求一个名称,开发人员可以识别哪个客户发起了哪个请求,然后在Session变量(Session期间存活的而且可以存储文本或者数值信息的变量-值对)中跟踪和维护客户端特定的信息。

因此,Sessions和cookies提供了一种良好的方法来绕开HTTP协议的无状态特性,而且Sessions和cookies在许多当前最大的站点上被用于跟踪和维护个人或者商业交易的信息。通常情况下,你使用session存储在一个访问的过程中所需要的值,而cookie存储用于多次访问的更持久的数据。

PHP自PHP 3.0就已经包含了对cookies的支持,而且自PHP 4.0开始其内建了session管理。这两个特征都是默认激活的,因此你不需要做任何特别的事情来激活它们。相反,请向下翻动然后看看你的第一个session。

第一个Session

用于演示session如何工作的标准例子之一就是点击计数器应用。这是一个简单的计数器,它在你第一次访问Web页面时初始化一个变量,然后在你每次重载该页面的时候增加该变量的值。计数器变量存储于session中,这意味着如果你浏览其他站点然后返回,那么上次存储的计数器的值将会恢复(只要你不在中间期间通过关闭浏览器而销毁该session)。
看看下面的代码:
<?php // initialize a session session_start(); // increment a session counter $_SESSION['counter']++; // print value echo "You have viewed this page " . $_SESSION['counter'] . " times"; ?>
为了弄明白这是如何工作的,通过浏览器请求上述脚本几次。你会注意到计数器值在每次随后的页面加载时加1。如果你打开两个浏览器窗口而且在每一个窗口中都请求同一个页面,那么PHP将会为每个浏览器实例维护和累加个自的session计数器。sessionID被用于标识哪个客户端发出了哪个请求,而且为每个单独的session重新创建之前存储的环境。这也意味着如果你在同一个session期间访问另外一个(或多个)Web站点然后返回到上述的脚本而在中间没有关闭你的浏览器,那么你之前的session将会为你被重新检索和创建。

PHP中的每一session都以一个对session_start()函数的调用开始。该函数检查一个session是否已经存在然后或者恢复它(如果存在的话)或者创建一个新的session(如果它不存在的话)。session变量然后可以通过在特殊的超全局数组变量$_SESSION中增加关键字和值而得到注册,然后该变量可以在session期间的任意时候使用标准数组符号被访问。在上面的例子中,一个名字为counter的关键字被增加到$_SESSION数组中。session第一次被创建的时候,该关键字的值为0。在同一session期间对每个后续的页面请求时,计数器之前的值将会被重新得到然后加1。

如果上述例子无法像所说的那样执行,那么请检查以确定你的php.ini文件中的session.save_path变量为你的系统指向了一个有效的临时目录。该值在默认情况下被硬编码为/tmp,因此如果你正在Windows系统下试验该例子,那么你需要将其编辑为C:\Windows\temp(或者你的系统的临时目录)。
0
相关文章