PHP中Session详解:定义、作用及PHP3实现方式综述
php中session详解

综述
用户在浏览某个网站时,从进入网站开始到浏览器关闭为止,这期间的时间被称为 Session,也就是用户浏览这个网站所花费的时间。从上述定义可以看出,Session 是一个特定的时间概念。
通常情况下,网站某一页面中的变量(这里指服务器端变量,以下同)无法在下一页中使用。然而,有了 session 之后就变得容易处理了。在 session 中注册的变量能够当作全局变量来使用。基于此,我们可以把 session 应用于用户身份认证、程序状态记录以及页面之间的参数传递等方面。
在PHP3版本中是如何实现session的?
php3 自身并未实现 session 功能,我们需要借助其他方法来达成。在这些方法中,最为知名的当属 phplib 了。phplib 最基本的功能包含用户认证、Session 管理、权限以及数据库的抽象化。接下来我们将讲述怎样利用 phplib 实现 session。
首先要进行 phplib 的安装,安装环境为 win2000 加上 php3.0.16 再加上 Apache1.3.12 以及 phplib7.2c 还有 mysql3.23.21 for win32 。
首先把 phplib 解开,接着会发现里面有一个“php”目录,然后把这个“php”目录拷贝到 Apache 的安装目录下。Apache 安装在 d:\Apache 目录下,接着把"php"目录拷贝到 d:\Apache 中,同时把 phplib 目录的 pages 目录下(不包含该目录本身)的文件和目录一同拷贝到 d:\Apache\htdocs 下。
phplib 的类库要依据系统来进行初始化,或许需要对 local.inc 文件进行修改,该文件中包含着一些基本参数,能够按照自身机器的实际状况来进行修改。
把 d:\Apache\php\prepend.php 文件里的一段程序改成如下的模样:
如果没有定义 $_PHPLIB 或者 $_PHPLIB 不是一个数组。
$_PHPLIB 的“libdir”为“d:/Apache/php/”,这是放 phplib 下 php 目录的路径。
修改d:\Apache\php\local.inc文件:
DB_Example 类继承自 DB_Sql 类。
mysql 数据库所在的主机名是 localhost 。
数据库名是 test 。 数据库名为 test 。 其数据库名是 test 。 该数据库名是 test 。 它的数据库名是 test 。 此数据库名是 test 。 这一数据库名是 test 。 那数据库名是 test 。 这一数据库的名是 test 。 那数据库的名是 test 。 此数据库的名是 test 。 该数据库的名是 test 。 其数据库的名是 test 。 它的数据库的名是 test 。
var $User = "root"; //数据库用户名
数据库用户密码为“1234567”,这里的变量$Password 所代表的就是这个密码。
首先根据 phplib 目录下的 stuff 子目录。然后找到其中的 create_database.mysql 文件。最后利用该文件生成初始表。
每一个使用 phplib 的页面首先都要能找到运行 phplib 所必需的类库文件,所以我们可以在 php.ini 中设置 auto_prepend 变量来提供支持。phplib 中包含一个 prepend.php 文件,把 auto_prepend 指定为“d:/Apache/php/prepend.php”(带引号)后,各个页面就会自动包含 phplib 类库。我们还可以将 phplib 类库所在的目录添加进 include 变量中,这样就能找到这些文件了。
2、调用page_open()函数
在每一个使用 phplib 的页面里,首先要做的是调用 page_open 函数来进行初始化。比如:
<?php
打开页面,参数为 array("sess" => "Test_Session")。
数组变量 sess 用于初始化一些状态保存对象。这里需要注意的是,必须使用 phplib 内置名 sess,并且这些内置名是在 local.inc 中定义的。
Phplib 使用了 Cookies 来保存状态信息。因此,page_open()函数需要在页面内容输出到浏览器之前被调用。php 脚本最后应以 page_close()结束,这样就能将有关状态数据写回到数据库中,不然变量就会丢失。
3、具体使用。
注册一个变量后,就能够在后续的页面里使用它,并且这种使用会一直持续到 session 结束。具体方法如下:
使用 PHP 语言,调用 $sess 的 register 方法,并传入 "varname" 作为参数。
请注意,这里的 varname 并非变量值,而是变量名。首先能够指定变量名,接着再进行赋值。在某一个页面里能够改变变量的值,后续页面访问该变量时,将会获取到改变后的数值。变量的类型具有多样性,它可以是一个字符串,也可以是一个数字,还可以是一个数组。例如:
第一页:
<?php
调用 page_open 函数并传入一个包含键值对 "sess" => "Test _Session" 的数组。
注册变量$welcome,使用$sess->register 进行注册,注意不需要加$
$welcome="Hello,PHP world!";
……
page_close();
第二页:
<?php
page_open();//开始session
显示第一页中定义的$welcome,这是通过 echo $welcome 来实现的。
page_close();//保存状态信息
注册完一个变量后,在页面最后调用 page_close()函数时,各个 session 变量会被写回到数据库中。若忘记调用 page_close()函数,变量就不会被写回数据库,从而会出现不可预知的后果。当变量使用完毕且不再需要时,可以调用以下函数将其删除。
<?php
page_open(array("sess" => "Test _Session"));
……
$sess 取消注册了 "variable_name"。
……
page_close();
在PHP4版本中是如何实现session的?
php4 的 session 是依靠 cookies 来保存 session id 的,并且在默认情况下是用文件系统来保存变量的,所以它的 session 变量不能保存对象。不过,也存在可以将 session 保存在数据库中的情况。
在 php4 里,有关 session 的函数数量不少(可详见 php.ini 配置这篇文章)。一般情况下,我们仅需调用三个函数就可以了,分别是 sesssion_start()、session_register()、session_is_registered()。
在每一页开始时若需要用到 session,就调用 session_start()函数,比如:
<?session_start()?>
<html><body>
$welcome="hello world !";
注册了“welcome”变量,需注意这里没有“$”符号。
检查是否注册了“welcome”变量,即判断 session 是否已注册“welcome”。如果 session 已注册“welcome”,则执行后续操作。
echo "welcome变量已经注册了!";
else
echo "welcome变量还没有注册!";
</body></html>
php4中session处理的定制
我们需要扩充6个函数:
打开会话,会话路径为 $sess_path,会话名称为 $session_name。
这个函数被session处理程序调用来作初始化工作。
参数 sess_path 与 php.ini 文件中的 session.save_path 选项相对应。
参数$session_name 与 php.ini 中的 session.name 选项相对应。
sess_close();
这个函数会在页面执行结束的时候被调用,同时当 session 处理程序需要关闭的时候也会被调用。
sess_read($key);
这个函数在 session 处理程序读取指定 session 键值($key)的时候,会进行检索并返回标识为$key 的 session 数据。需要注意的是,序列化是一种技术,它能在程序结束或需要时将变量或对象保存在文件中,然后在下次程序运行或需要时再调入内存,这与只保存数据的方法是不同的。
sess_write($key, $val);
这个函数据在特定情况下会被调用,即当 session 处理程序需要保存数据时。这种情况常常在程序结束的时候出现。它的作用是把数据保存在一个特定的地方,以便下次可以用 sess_read($key)函数进行检索。
sess_destroy($key);
这个函数在需要销毁 session 的时候,它的作用是删除 session 并且把环境清理掉。
sess_gc($maxlifetime);
这个函数的职责是清理碎片。在特定情形下,它的任务是删除过期的 session 数据。session 处理程序会时不时地调用它们。
定制程序能够以 mysql 数据库或者 DBM 文件的方式来保存 session 数据,这要根据具体的情况来确定。倘若使用 mysql 作为支持的话,那么就需要进行如下这些步骤:
首先在 MySQL 里创建一个名为 sessions 的数据库,接着创建一个名为 sessions 的表。
创建了一个名为 sessions 的数据库。 首先使用了“CREATE DATABASE”语句,接着指定了要创建的数据库名为“sessions”。 最终成功创建了名为“sessions”的数据库。
mysql 允许 phpsession@localhost 对 sessions 表具有 select(查询)、insert(插入)、update(更新)、delete(删除)的权限。
被“phpsession”所标识;
mysql 创建了一个名为 sessions 的表,这个表具有特定的结构和属性。它用于存储与会话相关的数据。表中的字段和数据类型等都是为了满足对会话信息的记录和管理需求而设计的。
-> sesskey char(32) not null,
expiry 是一个无符号的整数类型,长度为 11,并且不能为空。
-> value text not null,
-> PRIMARY KEY (sesskey)
-> );
接下来,要对 session_mysql.php 文件中的$SESS_DB*变量进行修改,让其与你机器上的数据库设置相匹配。
数据库主机名为 "localhost" ;该值被存储在 $SESS_DBHOST 中 ;它用于指定数据库所在的主机 。
数据库名为 "sessions",其对应的变量名为 $SESS_DBNAME 。
数据库用户名是$SESS_DBUSER,其值为"phpsession"。
$SESS_DBPASS 的值为 "phpsession",这是数据库密码。
$SESS_DBH = "";
获取配置变量“session.gc_maxlifetime”的值,并将其赋值给变量 SESS_LIFE 。
……//定制函数
设置会话保存处理器,包括打开会话(sess_open)、关闭会话(sess_close)、读取会话(sess_read)、写入会话(sess_write)、销毁会话(sess_destroy)以及垃圾回收(sess_gc)。
定制使用dbm文件时的接