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 编程的 5个良好习惯
Feb 20 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
Jun 18 PHP
php实现把数组按指定的个数分隔
Feb 17 PHP
php+Mysqli利用事务处理转账问题实例
Feb 11 PHP
PHP生成随机字符串(3种方法)
Sep 25 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 PHP
Yii2分页的使用及其扩展方法详解
May 23 PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 PHP
验证坐标在某坐标区域内php代码
Oct 08 PHP
php版银联支付接口开发简明教程
Oct 14 PHP
Python中使用django form表单验证的方法
Jan 16 PHP
PHP 图片处理
Sep 16 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 curl 模拟登录并获取数据实例详解
2016/12/22 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
用队列模拟jquery的动画算法实例
2015/01/20 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
JavaScript实现短暂提示框功能
2018/04/04 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
监听element-ui table滚动事件的方法
2019/03/26 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
通过C++学习Python
2015/01/20 Python
Python 数据结构之队列的实现
2017/01/22 Python
关于Python如何避免循环导入问题详解
2017/09/14 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
Python和Go语言的区别总结
2019/02/20 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
Python接收手机短信的代码整理
2020/08/02 Python
python3中确保枚举值代码分析
2020/12/02 Python
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
餐饮业的创业计划书范文
2013/12/26 职场文书
采购主管岗位职责
2014/02/01 职场文书
营销总经理岗位职责
2014/02/02 职场文书
元旦促销方案
2014/03/15 职场文书
教师自查自纠材料
2014/10/14 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
导游词之西递宏村
2019/12/10 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis
详解Django中 render() 函数的使用方法
2021/04/22 Python
redis实现排行榜功能
2021/05/24 Redis