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 相关文章推荐
PHP 一个比较完善的简单文件上传
Mar 25 PHP
PHP中数组的三种排序方法分享
May 07 PHP
php中url传递中文字符,特殊危险字符的解决方法
Aug 17 PHP
在PHP中使用X-SendFile头让文件下载更快
Jun 01 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
Dec 14 PHP
简单实现PHP留言板功能
Dec 21 PHP
PHP中字符串长度的截取用法示例
Jan 12 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP设计模式之状态模式定义与用法详解
Apr 02 PHP
详解php命令注入攻击
Apr 06 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
Oct 04 PHP
PHP如何通过带尾指针的链表实现'队列'
Oct 22 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
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
实用函数5
2007/11/08 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
php与java通过socket通信的实现代码
2013/10/21 PHP
php文件缓存类汇总
2014/11/21 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
PHP实现八皇后算法
2019/05/06 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
超漂亮的jQuery图片轮播特效
2015/11/24 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
JQuery日历插件My97DatePicker日期范围限制
2016/01/20 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
pytorch 模型可视化的例子
2019/08/17 Python
Python JSON编解码方式原理详解
2020/01/20 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
Champion官网:美国冠军运动服装
2017/01/25 全球购物
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
出售房屋委托书范本
2014/09/24 职场文书
2015年暑假生活总结
2015/07/13 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
python如何获取网络数据
2021/04/11 Python
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python