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连接mssql的一些相关经验及注意事项
Feb 05 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
php四种基础算法代码实例
Oct 29 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
Apr 10 PHP
PHP页面实现定时跳转的方法
Oct 31 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
Nov 20 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
PHP中单例模式与工厂模式详解
Feb 17 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
Mar 02 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
Mar 31 PHP
PHP简单实现遍历目录下特定文件的方法小结
May 22 PHP
PHP实现上传图片到数据库并显示输出的方法
May 31 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
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
初学CAKEPHP 基础教程
2009/11/02 PHP
可以保证单词完整性的PHP英文字符串截取代码分享
2014/07/15 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
文字垂直滚动之javascript代码
2015/07/29 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
2018/05/02 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
Python学习笔记之常用函数及说明
2014/05/23 Python
跟老齐学Python之类的细节
2014/10/13 Python
python实现bucket排序算法实例分析
2015/05/04 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
如何通过python画loss曲线的方法
2019/06/26 Python
详解Python self 参数
2019/08/30 Python
python实现二分类的卡方分箱示例
2019/11/22 Python
Python reques接口测试框架实现代码
2020/07/28 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
2021/01/27 Python
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
个人应聘自我评价分享
2013/11/18 职场文书
学生党员思想汇报
2013/12/28 职场文书
小学生获奖感言范文
2014/02/02 职场文书
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
法定代表人身份证明书
2014/09/10 职场文书
个人工作决心书
2015/09/22 职场文书