原文作者:Deian Motov
发布日期:Sunday, 30 September 2007
译 者:石头希迁
一点耐心
现在,你已经用PHP连接了MySQL和SQLite,你可能觉得,你已经知道了使用PHP编程需要知道的一切了。或者,你甚至在考虑,用不着再访问Zend.com,也可以放弃这里的系列文章,去看一些更加豪华和更酷的...
Uh-uh,大错特错。
你要明白,虽然内建的数据库支持使得PHP编程更加容易,但这决不是PHP如此流行的唯一原因。方便的XML API和异常处理机制(PHP 5)、模块插件、内建的session管理等等也只是众多使得PHP流行的部分功能而已。PHP的这些内容将会在这一系列里面深入的讨论,希望你能自己找到它们,并且能个逗留稍微长点儿的时间。好了,现在,闭上眼睛,深呼吸,然后,继续你的阅读和发现----这个教程的主题是Sessions和cookies。
演出开始了
也许你曾听说:“HTTP是一个无状态的协议,Internet是一个无状态的开发环境”。
不?Hmmm。或者,并不全对。
用简单的话说,这句话的意思是,HTTP,即超文本传输协议,这个作为Web基石的协议并不能保留每个连接到Web服务器的客户端的标识,这样,对待每一个对Web页面的请求都被视为唯一和独立的连接,无论怎样,都和这个连接之前的连接没有任何关系。这种无状态的环境在你漫无目的的上网冲浪工作得非常好,可是,对于依赖于之前访问和数据的网站,它又产生一些很让人头疼的问题。最典型的例子是在线购物车----在无状态的环境,当访问者从一个页面跳到另一个页面时,系统保留你的访问踪迹,和采购单是很困难的。
很明显, 需要一个方法来维护状态,允许跟踪和维护一些客户端的连接数据。这样,cookies就出现了,cookies允许网站保存一些用户相关的信息在用户的系统中,并可以在任何需要的时候访问。一个cookie是一个简单的文件,其中保存了一些变量-值对,以及其链接到的域。当一个用户访问一个特定的域时,cookie中的值就会被读出并导入到服务器的环境里,这样,开发者就可以读,修改和使用这些值来实现他们的目的。将用户一次访问的数据带入到下一次访问,cookie是一个很方便的方法。
令一个常用的实现是使用session来保存连接相关的数据,这种session数据在用户访问中被保留在服务器端,并在最后销毁。每个session被赋予一个ID(每个session拥有一个唯一的ID),在PHP中,
这个ID是PHP自动产生的。此session ID保存在两个位置:在客户端,使用一个临时的cookie,而在服务器端,使用平面文件或者数据库。session ID为每一次每一次接受到的请求赋予了一个名字,开发者可以标识出哪一个客户端开始了哪一次请求,可以在session变量中跟踪和维护用户相关的数据(变量-值对在会话期间都是可访问的,可以保存数值的和文字的信息)。
Sessions和cookies以这种方式绕过了HTTP协议的无状态约定,而且,被广泛使用在大量的最新的网站上用以维护个人和商业事务的信息。典型的,人们通常使用session来保存单次访问过程中的一些信息,而使用cookie来保存多次访问的数据。
PHP从PHP3.0开始支持cookies,内建的session管理从PHP4.o开始。所以这些特性都是缺省开启的,因此不必专门去激活这些特性。下面,看看你的第一个session。
第一个Session
用于演示session如何工作的第一个例子是点击计数程序。这是一个简单的计数器,但用户第一次访问的时候,这个计数器初始化,在用户重新连接这个网页的时候会增加。计数变量存储在一个session里面,这意味着,如果你访问之后访问了其他的站点,然后又回来,这个计数器的值会恢复(只要你没有通过关闭浏览器销毁这个session)。
看看代码:
想看看它是如何工作,通过浏览器,请求上面那段脚本,你会注意到,伴随着每次请求,计数器增加了1。如果你打开两个浏览器,每一个都请求这个脚本,PHP会为每个浏览器维护独立的计数器,它们各自增长。Session ID是用来标识不同的客户端的请求的,并为每个独立的会话创建保存好的之前访问的环境。这也意味着,在同一个会话中,用户反问了其他的网站,然后再头来再访问上面的脚本,只要你没有关闭你的浏览器,便可以恢复之前的session并为你重新创建。
<?php
// initialize a session
session_start();
// increment a session counter
$_SESSION['counter']++;
// print value
echo "You have viewed this page " . $_SESSION['counter'] . " times";
?>
PHP中每一个session通过session_start()开始。这个函数检查session是否已经存在,要么恢复它(如果它存在的话),要么创建一个新的(如果它不存在的话)。session变量可以通过对$_SESSION superglobal数组添加key-value对来注册。可以在会话期的任何时候通过标准的数值标识来访问。上面的例子中,counter被加入$_SESSION数组,第一次被创建的时候为0,同一个会话中,每次对这个脚本的再请求都会重新获得counter,并增加1。
如果上面的例子并没有如我说的工作,请检查php.ini中session.save_path变量是否指向你系统的临时目录。这个变量缺省被硬编码为/tmp如果你使用windows系统,你需要编辑它为C:\Windows\temp(你系统的临时目录)。
(To be continued...)
没有评论:
发表评论