• 技术文章 >后端开发 >php教程

    Zend Framework实现将session存储在memcache中的方法,zendmemcache_PHP教程

    2016-07-12 08:56:11原创359

    Zend Framework实现将session存储在memcache中的方法,zendmemcache


    本文实例讲述了Zend Framework实现将session存储在memcache中的方法。分享给大家供大家参考,具体如下:

    在zend framework中,已经可以将session存储在数据库中了,不过还不支持memcache,我简单得实现了一下。

    下面是SaveHandler,文件名为 :Memcached.php ,将其放在 /Zend/Session/SaveHandler 目录下,代码如下(需要有php_memcache支持,因为字符长度限制,我把部分注释去掉了):

    require_once 'Zend/Session.php';
    require_once 'Zend/Config.php';
    class Zend_Session_SaveHandler_Memcached implements Zend_Session_SaveHandler_Interface
    {
      const LIFETIME     = 'lifetime';
      const OVERRIDE_LIFETIME = 'overrideLifetime';
      const MEMCACHED      = 'memcached';
      protected $_lifetime = false;
      protected $_overrideLifetime = false;
      protected $_sessionSavePath;
      protected $_sessionName;
      protected $_memcached;
      /**
       * Constructor
       *
       * $config is an instance of Zend_Config or an array of key/value pairs containing configuration options for
       * Zend_Session_SaveHandler_Memcached . These are the configuration options for
       * Zend_Session_SaveHandler_Memcached:
       *
       *
       *   sessionId    => The id of the current session
       *   sessionName   => The name of the current session
       *   sessionSavePath => The save path of the current session
       *
       * modified      => (string) Session last modification time column
       *
       * lifetime     => (integer) Session lifetime (optional; default: ini_get('session.gc_maxlifetime'))
       *
       * overrideLifetime => (boolean) Whether or not the lifetime of an existing session should be overridden
       *   (optional; default: false)
       *
       * @param Zend_Config|array $config   User-provided configuration
       * @return void
       * @throws Zend_Session_SaveHandler_Exception
       */
      public function __construct($config)
      {
        if ($config instanceof Zend_Config) {
          $config = $config->toArray();
        } else if (!is_array($config)) {
          /**
           * @see Zend_Session_SaveHandler_Exception
           */
          require_once 'Zend/Session/SaveHandler/Exception.php';
          throw new Zend_Session_SaveHandler_Exception(
            '$config must be an instance of Zend_Config or array of key/value pairs containing '
           . 'configuration options for Zend_Session_SaveHandler_Memcached .');
        }
        foreach ($config as $key => $value) {
          do {
            switch ($key) {
              case self::MEMCACHED:
                $this->createMemcached($value);
                break;
              case self::LIFETIME:
                $this->setLifetime($value);
                break;
              case self::OVERRIDE_LIFETIME:
                $this->setOverrideLifetime($value);
                break;
              default:
                // unrecognized options passed to parent::__construct()
                break 2;
            }
            unset($config[$key]);
          } while (false);
        }
      }
      /**
       * 创建memcached连接对象
       *
       * @return void
       */
      public function createMemcached($config){
       $mc = new Memcache;
       foreach ($config as $value){
        $mc->addServer($value['ip'], $value['port']);
       }
       $this->_memcached = $mc;
      }
      public function __destruct()
      {
        Zend_Session::writeClose();
      }
      /**
       * Set session lifetime and optional whether or not the lifetime of an existing session should be overridden
       *
       * $lifetime === false resets lifetime to session.gc_maxlifetime
       *
       * @param int $lifetime
       * @param boolean $overrideLifetime (optional)
       * @return Zend_Session_SaveHandler_Memcached
       */
      public function setLifetime($lifetime, $overrideLifetime = null)
      {
        if ($lifetime < 0) {
          /**
           * @see Zend_Session_SaveHandler_Exception
           */
          require_once 'Zend/Session/SaveHandler/Exception.php';
          throw new Zend_Session_SaveHandler_Exception();
        } else if (empty($lifetime)) {
          $this->_lifetime = (int) ini_get('session.gc_maxlifetime');
        } else {
          $this->_lifetime = (int) $lifetime;
        }
        if ($overrideLifetime != null) {
          $this->setOverrideLifetime($overrideLifetime);
        }
        return $this;
      }
      /**
       * Retrieve session lifetime
       *
       * @return int
       */
      public function getLifetime()
      {
        return $this->_lifetime;
      }
      /**
       * Set whether or not the lifetime of an existing session should be overridden
       *
       * @param boolean $overrideLifetime
       * @return Zend_Session_SaveHandler_Memcached
       */
      public function setOverrideLifetime($overrideLifetime)
      {
        $this->_overrideLifetime = (boolean) $overrideLifetime;
        return $this;
      }
      public function getOverrideLifetime()
      {
        return $this->_overrideLifetime;
      }
      /**
       * Retrieve session lifetime considering
       *
       * @param array $value
       * @return int
       */
      public function open($save_path, $name)
      {
        $this->_sessionSavePath = $save_path;
        $this->_sessionName   = $name;
        return true;
      }
      /**
       * Retrieve session expiration time
       *
       * @param * @param array $value
       * @return int
       */
      public function close()
      {
        return true;
      }
      public function read($id)
      {
        $return = '';
        $value = $this->_memcached->get($id); //获取数据
        if ($value) {
          if ($this->_getExpirationTime($value) > time()) {
            $return = $value['data'];
          } else {
            $this->destroy($id);
          }
        }
        return $return;
      }
      public function write($id, $data)
      {
        $return = false;
        $insertDate = array('modified' => time(),
                   'data'   => (string) $data);
          $value = $this->_memcached->get($id); //获取数据
        if ($value) {
          $insertDate['lifetime'] = $this->_getLifetime($value);
          if ($this->_memcached->replace($id,$insertDate)) {
            $return = true;
          }
        } else {
          $insertDate['lifetime'] = $this->_lifetime;
          if ($this->_memcached->add($id, $insertDate,false,$this->_lifetime)) {
            $return = true;
          }
        }
        return $return;
      }
      public function destroy($id)
      {
        $return = false;
        if ($this->_memcached->delete($id)) {
          $return = true;
        }
        return $return;
      }
      public function gc($maxlifetime)
      {
        return true;
      }
      protected function _getLifetime($value)
      {
        $return = $this->_lifetime;
        if (!$this->_overrideLifetime) {
          $return = (int) $value['lifetime'];
        }
        return $return;
      }
      protected function _getExpirationTime($value)
      {
        return (int) $value['modified'] + $this->_getLifetime($value);
      }
    }
    
    

    配置(可以添加多台memcache服务器,做分布式):

    $config = array(
      'memcached'=> array(
        array(
          'ip'=>'192.168.0.1',
          'port'=>11211
        )
      ),
      'lifetime' =>123334
    );
    //create your Zend_Session_SaveHandler_DbTable and
    //set the save handler for Zend_Session
    Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_Memcached($config));
    //start your session!
    Zend_Session::start();
    
    

    配置好后,session的使用方法和以前一样,不用管底层是怎么实现的!

    更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

    您可能感兴趣的文章:

    www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1113723.htmlTechArticleZend Framework实现将session存储在memcache中的方法,zendmemcache 本文实例讲述了Zend Framework实现将session存储在memcache中的方法。分享给大家供大家...

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Zend Framework session memcache memcache
    上一篇:PHP的Laravel框架中使用消息队列queue及异步队列的方法,laravelqueue_PHP教程 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 一文解析PHP元转分的错误示范(附代码实例)• PHP+Socket系列之实现websocket聊天室• PHP+Socket系列之实现客户端与服务端数据传输• PHP+Socket系列之IO多路复用及实现web服务器• 一文详解PHP用流方式实现下载文件(附代码示例)
    1/1

    PHP中文网