Monday, April 4, 2011

Zend_Session会话处理实例详解(一)_ZEND中国_百度空间

Zend_Session会话处理实例详解(一)_ZEND中国_百度空间

在计算机语言中,会话是一种面向连接的可靠通信方式。而会话处理机制,即是指编程语言实现基于会话的通信的方式。在PHP中,会话(session)代表服务器端与客户端之间的一种持久的状态数据。使用ZendFrameworkSession可以在由相同客户端发起的多个页面请求之间,管理和保护会话数据。本章介绍如何使用Zend_Session组件来实现会话的处理。
1 Zend_Session会话简介
正如本章引言所说的,会话的本质是一种数据,它代表着服务器与客户端之间的一种状态。例如,论坛登录的用户数据、用户的登录时间、正在浏览的页面等都属于会话的范畴。在Zend_Session中的会话数据是对Cookie数据的扩展。但该数据又与Cookie数据有所不同。二者最明显的区别就是会话数据不储存在客户端,而Cookie则通常保存在客户端。会话数据仅在服务器端源代码使用时,才通过回应客户端的请求与客户端共享会话数据。
Zend_Session组件中,“session data”代表存储在服务器端的$_SESSION数组中的数据。该数据使用Zend_Session来管理,由会话命名空间(Zend_Session_Namespace,该类为Zend_Session的一个子类)以对象的方式来控制。命名空间逻辑上就是一系列以字符串为键名的联合数组,这类似于普通的PHP数组。
Zend_Session_Namespace的实例用对象存储的方式实现了$_SESSION的命名空间。Zend_Session组件封装了PHP内置的会话模块,同时还提供了一个管理会话的接口,而且也为Zend_Session_Namespace 持久化命名空间数据提供了API
Zend_Session_Namespace为会话命名空间数据到PHP内部会话机制的持久化提供了一个标准的、面向对象的接口。Zend_Session支持现有无名的会话,同时也支持“登录会话”(提供用户名与密码的会话)。因为Zend_Session使用了PHP内置的会话函数,所以常用的配置选项和设置都仍然适用。正因为如此,储存在cookie或者URL中的会话标识,会保持客户端与服务器端会话状态数据之间的联系。
2 Zend_Session基本用法
上一节对Zend_Session做了一个纯理论性的简介。本节将以具体的实例来讲解Zend_Session的基本用法。其中包括如何使用Zend_Session实现会话、如何对会话命名空间进行迭代以及如何对会话命名空间进行访问。
2.1 使用Zend_Session
本小节来介绍如何使用Zend_Session实现会话。要使用Zend_Session会话,应该需要以下几个步骤。
1)引用命名空间(Zend_Session_Namespace)类。
2)为命名空间类实例化一个对象。可以使用new关键字为类实例化对象,其中要使用参数命名空间。如果不指定参数,则类的构造函数会使用默认的命名空间参数,其值为Default
3)使用Zend_Session_Namespace类的实例的成员,可以对其进行赋值或者读取操作。下面通过一个实例来演示,如何使用Zend_Session实现最基本的会话处理。

require_once 'Zend/Session/Namespace.php'; //加载Zend_Session_Namespace组件
$myNamespace=new Zend_Session_Namespace('Myspace'); //为类实例化一个对象
if(isset($myNamespace->numberOfPageRequests)) //判断指定成员是否有值
{
$myNamespace->numberOfPageRequests++; //如果有值则将其累加
}
else
{
$myNamespace->numberOfPageRequests=1; //如果无值,对其进行赋值操作
}
echo "用户的浏览次数为:";
echo "";

echo $myNamespace->numberOfPageRequests; //输出获取的对象成员值

echo "";
?>

将以上代码保存为1.php。以上代码首先为Zend_Session_Namespace实例化一个对象,然后判断对象成员是否存在。当指定成员不存在时,写入内容对其进行赋值;如果指定成员存在,则对其进行累加。最后输出获取的成员结果。该代码实现了简单的计数器效果,直接刷新网页即可看到结果。代码的执行结果将会如图1所示。

1 最基本的Zend_Session会话
2.2 遍历会话命名空间
会话命名空间Zend_Session_Namespace支持foreach语句(通过循环遍历所有成员的PHP语句)。基于这一点,可以使用foreach语句对会话命名空间进行迭代,以遍历会话命名空间中的全部值。下面通过一个实例来说明,如何实现对会话命名空间的遍历。

require_once 'Zend/Session/Namespace.php'; //加载Zend_Session_Namespace组件
$myNamespace=new Zend_Session_Namespace('Myspace'); //为类实例化一个对象
$myNamespace->webhost="127.0.0.1"; //为对象成员赋值
$myNamespace->hostname="localhost";
$myNamespace->user="root";
$myNamespace->password="123456";
$myNamespace->db_name="test";
$myNamespace->db_type="Sqlite";
foreach($myNamespace as $index=>$value) //对命名空间进行遍历
{
echo "命名空间myNamespace中的:".$index;
echo "".$value."
\n"; //输出内容
}
?>
将以上代码保存为2.php,执行该代码,其结果将会如图2所示。

2 通过迭代遍历命名空间中的内容
从图2所示的执行结果中可以看出,通过执行foreach语句,实现了对指定命名空间中内容的遍历。说明程序成功执行。
2.3 访问会话命名空间
访问会话命名空间可以使用通常对于一般变量的方法,如直接为变量赋值、直接读取变量的值、使用isset()函数判断其是否为Null值、使用unset()来注销变量等。下面通过实例来说明,如何使用这些方法来访问会话命名空间。

require_once 'Zend/Session/Namespace.php'; //加载Zend_Session_Namespace组件
$login=new Zend_Session_Namespace('other'); //为类实例化一个对象
$login->user="Administrator"; //直接为对象成员赋值
if(isset($login->user)) //判断对象成员是否有值
{
echo "\$login->user已经有值,其值为:";
echo $login->user; //直接获取会话命名空间成员的值
unset($login->user); //将指定的值注销
}
else
{
echo "\$login->user无值"; //如果无值时输出内容
}
echo "
";
if(isset($login->pass)) //判断另一个对象成员
{
echo "\$login->pass已经有值,其值为:";
echo $login->pass;
}
else
{
echo "\$login->pass无值!"; //如果无值时输出内容
echo "
";
$login->pass="123456"; //将对其进行赋值
}
echo "
";
foreach($login as $index=>$value) //对命名空间进行遍历
{
echo "命名空间login中的:".$index."".$value."
\n"; //迭代输出内容
}
?>
以上代码中分别实现了对会话命名空间的读取、赋值、判断和注销四种操作。将以上代码保存为3.php,执行该代码其结果将会如图3所示。

3 访问会话命名空间
文章来源:http://www.zendchina.net/?action-viewnews-itemid-2200

0 评论:

Post a Comment