Zend Framework入门教程之Zend_Session会话操作详解


Posted in PHP onDecember 08, 2016

本文实例讲述了Zend Framework入门教程之Zend_Session会话操作。分享给大家供大家参考,具体如下:

会话命名空间

实现会话

代码:

<?php
require_once "Zend/Session/Namespace.php";
$myNamespace = new Zend_Session_Namespace('Myspace');
if(isset($myNamespace->numberOfPageRequests))
{
  $myNamespace->numberOfPageRequests++;
}else{
  $myNamespace->numberOfPageRequests = 1;
}
echo "用户的浏览次数为:";
echo "<font size=\"6\" color=\"#ff0000\">";
echo $myNamespace->numberOfPageRequests;
echo "</font>次";

结果:

用户的浏览次数为:10次

遍历会话命名空间

代码:

<?php
require_once "Zend/Session/Namespace.php";
$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."<p>\n";
}

结果:

命名空间myNamespace中的:webhost为127.0.0.1
命名空间myNamespace中的:hostname为localhost
命名空间myNamespace中的:user为root
命名空间myNamespace中的:password为123456
命名空间myNamespace中的:db_name为test
命名空间myNamespace中的:db_type为Sqlite

点评:

它会把这个对象所对应空间中的所有内容遍历出来。很神奇。

访问会话命名空间

代码:

<?php
require_once "Zend/Session/Namespace.php";
$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 "<p>";
if(isset($login->pass)){
  echo "\$login->pass已经有值,其值为:";
  echo $login->pass;
  unset($login->pass);
}else{
  echo "\$login->pass无值";
}
foreach($login as $index=>$value){
  echo "命名空间login中的:".$index."为".$value."<p>\n";
}

结果:

$login->user已经有值,其值为:Administrator
$login->pass无值

会话的高级应用

开启会话,有两种方法

一、使用Zend_Session::start()开启会话

二、new Zend_Session_Namespace()

锁定会话命名空间

代码:

<?php
require_once "Zend/Session/Namespace.php";
$test = new Zend_Session_Namespace('test');
$test->name = "玉皇大帝";
$test->sex = "男";
$test->lock();
if($test->isLocked()){
  echo "会话\$test已经锁定!<p>";
  echo "命名空间\$test中的成员name的值为:";
  echo $test->name;
}else{
  echo "会话\$test已经解锁!";
}
echo "<p>";
$test->unLock();
if($test->isLocked()){
  echo "会话\$test已经锁定!<p>";
  echo "命名空间\$test中的成员name的值为:";
  echo $test->name;
}else{
  echo "会话\$test已经解锁!";
}

结果:

会话$test已经锁定!

命名空间$test中的成员name的值为:玉皇大帝

会话$test已经解锁!

点评:

由此可见,锁定并不影响结果的输出。

分析源代码

public function lock()
{
    self::$_namespaceLocks[$this->_namespace] = true;
}
/**
* unlock() - unmark a session/namespace to enable read & write
*
* @return void
*/
public function unlock()
{
    unset(self::$_namespaceLocks[$this->_namespace]);
}
/**
* unlockAll() - unmark all session/namespaces to enable read & write
*
* @return void
*/
public static function unlockAll()
{
    self::$_namespaceLocks = array();
}
/**
* isLocked() - return lock status, true if, and only if, read-only
*
* @return bool
*/
public function isLocked()
{
    return isset(self::$_namespaceLocks[$this->_namespace]);
}

可知,它只是改变了参数而已。

为会话设置生命周期

setExpirationSeconds()方法与setExpirationHops()两种方法来设置。

代码:

<?php
require_once "Zend/Session/Namespace.php";
$s = new Zend_Session_Namespace('temp');
$s->a = "苹果";
$s->p = "梨";
$s->o = "桔子";
$s->setExpirationSeconds(60);
$s->setExpirationHops(2,'a');
$s->setExpirationHops(3,'p');
echo "已经为命名空间\$s设置生命期<p>";

设置生命期代码,其实它针对的是命名空间来设置的。

测试代码:

<?php
require_once "Zend/Session/Namespace.php";
$b = new Zend_Session_Namespace('temp');
echo "\$b->a内容为:".$b->a;
echo "<p>";
echo "\$b->p内容为:".$b->p;

先执行设置生命期代码,在执行测试代码会看到效果。

第一次:
$b->a内容为:苹果
$b->p内容为:梨
第二次:
$b->a内容为:苹果
$b->p内容为:梨
第三次:
$b->a内容为:
$b->p内容为:梨
第四次:
$b->a内容为:
$b->p内容为:

点评:刷新两次之后,就会有消失。之后陆续消失。超过60秒效果相同。

分析源代码,

public function setExpirationSeconds($seconds, $variables = null)
{
    if (parent::$_writable === false) {
      /**
       * @see Zend_Session_Exception
       */
      require_once 'Zend/Session/Exception.php';
      throw new Zend_Session_Exception(parent::_THROW_NOT_WRITABLE_MSG);
    }
    if ($seconds <= 0) {
      /**
       * @see Zend_Session_Exception
       */
      require_once 'Zend/Session/Exception.php';
      throw new Zend_Session_Exception('Seconds must be positive.');
    }
    if ($variables === null) {
      // apply expiration to entire namespace
      $_SESSION['__ZF'][$this->_namespace]['ENT'] = time() + $seconds;
    } else {
      if (is_string($variables)) {
        $variables = array($variables);
      }
      foreach ($variables as $variable) {
        if (!empty($variable)) {
          $_SESSION['__ZF'][$this->_namespace]['ENVT'][$variable] = time() + $seconds;
        }
      }
    }
}

其实它还是基于PHP原始的Session来实现的。只是扩展了部分功能。

public function setExpirationHops($hops, $variables = null, $hopCountOnUsageOnly = false)
{
    if (parent::$_writable === false) {
      /**
       * @see Zend_Session_Exception
       */
      require_once 'Zend/Session/Exception.php';
      throw new Zend_Session_Exception(parent::_THROW_NOT_WRITABLE_MSG);
    }
    if ($hops <= 0) {
      /**
       * @see Zend_Session_Exception
       */
      require_once 'Zend/Session/Exception.php';
      throw new Zend_Session_Exception('Hops must be positive number.');
    }
    if ($variables === null) {
      // apply expiration to entire namespace
      if ($hopCountOnUsageOnly === false) {
        $_SESSION['__ZF'][$this->_namespace]['ENGH'] = $hops;
      } else {
        $_SESSION['__ZF'][$this->_namespace]['ENNH'] = $hops;
      }
    } else {
      if (is_string($variables)) {
        $variables = array($variables);
      }
      foreach ($variables as $variable) {
        if (!empty($variable)) {
          if ($hopCountOnUsageOnly === false) {
            $_SESSION['__ZF'][$this->_namespace]['ENVGH'][$variable] = $hops;
          } else {
            $_SESSION['__ZF'][$this->_namespace]['ENVNH'][$variable] = $hops;
          }
        }
      }
    }
}

处理放在了构造函数中。

希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。

PHP 相关文章推荐
一个很方便的 XML 类!!原创的噢
Oct 09 PHP
一个程序下载的管理程序(二)
Oct 09 PHP
怎样在php中使用PDF文档功能
Oct 09 PHP
PHP读取目录下所有文件的代码
Jan 07 PHP
关于PHP堆栈与列队的学习
Jun 21 PHP
PHP类的反射用法实例
Nov 03 PHP
一个经典的PHP验证码类分享
Nov 18 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
Fleaphp常见函数功能与用法示例
Nov 15 PHP
php数值转换时间及时间转换数值用法示例
May 18 PHP
Zend Framework入门教程之Zend_Mail用法示例
Dec 08 #PHP
Zend Framework入门教程之Zend_Db数据库操作详解
Dec 08 #PHP
zend框架实现支持sql server的操作方法
Dec 08 #PHP
ZendFramework框架实现连接两个或多个数据库的方法
Dec 08 #PHP
thinkPHP模板引擎用法示例
Dec 08 #PHP
thinkPHP中session()方法用法详解
Dec 08 #PHP
thinkPHP引入类的方法详解
Dec 08 #PHP
You might like
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
php学习之function的用法
2012/07/14 PHP
带密匙的php加密解密示例分享
2014/01/29 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
setTimeout学习小结
2017/02/08 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
Python在图片中添加文字的两种方法
2017/04/29 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
Python使用add_subplot与subplot画子图操作示例
2018/06/01 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
html5组织文档结构_动力节点Java学院整理
2017/07/11 HTML / CSS
致标枪运动员广播稿
2014/02/06 职场文书
一年级学生期末评语
2014/04/21 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
卫校毕业生个人自我鉴定
2014/04/28 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
个人求职信格式范文
2015/03/20 职场文书
2015年信息化建设工作总结
2015/07/23 职场文书
护士岗位竞聘书
2015/09/15 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
Python中glob库实现文件名的匹配
2021/06/18 Python