日期:2014-05-20  浏览次数:20770 次

ZendFramework学习第三章(核心组件—会话处理之Zend_Session高级用法)

上一节是在会话处理方面的基本应用。这一节和大家一起学习Zend_Session的高级应用,内容包括坐定会话命名空间、会话过期、会话封装与控制以及防止一个会话命名空间的多重实例等


对于如何开启session就不用我多做描述了,方法:Zend_Session::start();


锁定会话的命名空间

为会话命名空间实例初始化对象并赋值后,有时为了特定的需要,会锁定会话命名空间,以防止其他内容对其值进行更改。

使用Zend_Session_Namespace的locked()方法可以锁定会话命名空间(就是将其改为只读状态)。

使用使用Zend_Session_Namespace的unLock()方法可以解除会话命名空间实例的锁定状态。

如果判断会话的命名空间是否处于锁定状态使用使用使用Zend_Session_Namespace的isLock() 。

示例:

//Zend_Sessoin的高级用法,锁定会话命名空间
    $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 "会话已经解锁!";
     }
  echo "<p>";

  $test->unlock();
  if ($test->isLocked())
  {
   echo "会话\$test已经锁定!";
   echo "命名空间\$test中的成员name的值为:";
   echo  $test->name;
 
  }
  else
  {
   echo "会话已经解锁!";
  }

运行结果:

会话$test已经锁定!

命名空间$test中的成员name的值为:李宇春

会话已经解锁!

 

为会话设置声明周期

每个会话都有其生命期,默认情况下会话在关闭页面时结束生命期。通过Zend_session_Namespace的setExpirationSeconds()方法与setExpirationHops()方法可以为每个会话设置生命期。

两个方法的语法格式分别如下:

    setExprirationSeconds($seconds,$variables=null);

    其中,参数$seconds为指定的会话生命期的秒数,以数值型表示;可选参数$variables为指定的会话实力的成员,默认为空。执行该方法将会为会话实例成员(制定$variables参数)或者整个会话实例(不指定$variables参数)设置以$seconds参数指定的生命期。


setExpirationHops($hops,$variables=null,$hopCountOnUsageOnly=false);


其中,参数$hops未指定会话过期的步数,以数值型表示;可选参数$variables为指定的会话实例的成员,默认值为空;可选参数$hopCountOnUsageOly为布尔型变量,指定对象成员在使用时是否被计数一次,默认值为false。执行该方法将会为会话实例的成员活着整个会话实例设置以$hops参数指定的步数,当使用能够次数超过$hops值时,会话成员将失败!

示例:

     $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设置生命周期"; */
    

我将此代码写到了inex控制器中的index方法里,下边代码写到了index控制器中的getsession方法中:

  public function getsessionAction()
    {
     $s=new Zend_Session_Namespace('temp');
    
     echo "\$s->a的内容为:".$s->a."<p>";
     echo "\$s->p的内容为:".$s->p."<p>";
    }


先执行方法1结果:

已经为命名空间$s设置生命周期

连续执行方法2  三次 时结果:

$a->a无值

$a->p有值

 

连续执行方法 2  四次时结果:

两个都没值

 


防止多重实例

为了防止多重实例的出现,可以在建立命名空间最后允许的实例时,传递true给第二个构造函数参数。在防止多重实例我不做过多解释了就是如下:

$space1=new Zend_Session_Namespace('space');

$space2=new Zend_Session_Namespace('space',true);

经过第二条语句的操作之后,之后初始化同一个命名空间都会导致一个异常抛出,这样即可防止多重实例。

 

今天把ie8升级到了9,发现ie9与csdn的编辑页面并不是很兼容。。应该是在文章内容自动保存过一次之后,就开始出现bug在线编辑器不能用鼠标选中,也不能使用在线编辑器的功能。 最新的火狐是米有问题的。。。。我是把内容写了一半才发现的。很是蛋疼,排版是我下载了个火狐进行排版的。。