当前位置:首页 > PHP教程 > Zend > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-20 22:11:56 浏览: 评论:0 

这篇文章主要介绍了Zend Framework实现将session存储在memcache中的方法,结合实例形式分析了Zend Framework框架下将session存储在memcache的实现技巧,需要的朋友可以参考下。

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

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

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

  1. require_once 'Zend/Session.php'
  2. require_once 'Zend/Config.php'
  3. class Zend_Session_SaveHandler_Memcached implements Zend_Session_SaveHandler_Interface 
  4.   const LIFETIME     = 'lifetime'
  5.   const OVERRIDE_LIFETIME = 'overrideLifetime'
  6.   const MEMCACHED      = 'memcached'
  7.   protected $_lifetime = false; 
  8.   protected $_overrideLifetime = false; 
  9.   protected $_sessionSavePath
  10.   protected $_sessionName
  11.   protected $_memcached
  12.   /** 
  13.    * Constructor 
  14.    * 
  15.    * $config is an instance of Zend_Config or an array of key/value pairs containing configuration options for 
  16.    * Zend_Session_SaveHandler_Memcached . These are the configuration options for 
  17.    * Zend_Session_SaveHandler_Memcached: 
  18.    * 
  19.    * 
  20.    *   sessionId    => The id of the current session 
  21.    *   sessionName   => The name of the current session 
  22.    *   sessionSavePath => The save path of the current session 
  23.    * 
  24.    * modified      => (string) Session last modification time column 
  25.    * 
  26.    * lifetime     => (integer) Session lifetime (optional; default: ini_get('session.gc_maxlifetime')) 
  27.    * 
  28.    * overrideLifetime => (boolean) Whether or not the lifetime of an existing session should be overridden 
  29.    *   (optional; default: false) 
  30.    * 
  31.    * @param Zend_Config|array $config   User-provided configuration 
  32.    * @return void 
  33.    * @throws Zend_Session_SaveHandler_Exception 
  34.    */ 
  35.   public function __construct($config
  36.   { 
  37.     if ($config instanceof Zend_Config) { 
  38.       $config = $config->toArray(); 
  39.     } else if (!is_array($config)) { 
  40.       /** 
  41.        * @see Zend_Session_SaveHandler_Exception 
  42.        */ 
  43.       require_once 'Zend/Session/SaveHandler/Exception.php'
  44.       throw new Zend_Session_SaveHandler_Exception( 
  45.         '$config must be an instance of Zend_Config or array of key/value pairs containing ' 
  46.        . 'configuration options for Zend_Session_SaveHandler_Memcached .'); 
  47.     } 
  48.     foreach ($config as $key => $value) { 
  49.       do { 
  50.         switch ($key) { 
  51.           case self::MEMCACHED: 
  52.             $this->createMemcached($value); 
  53.             break
  54.           case self::LIFETIME: 
  55.             $this->setLifetime($value); 
  56.             break
  57.           case self::OVERRIDE_LIFETIME: 
  58.             $this->setOverrideLifetime($value); 
  59.             break
  60.           default
  61.             // unrecognized options passed to parent::__construct() 
  62.             break 2; 
  63.         } 
  64.         unset($config[$key]); 
  65.       } while (false); 
  66.     } 
  67.   } 
  68.   /** 
  69.    * 创建memcached连接对象 
  70.    * 
  71.    * @return void 
  72.    */ 
  73.   public function createMemcached($config){ 
  74.    $mc = new Memcache; 
  75.    foreach ($config as $value){ 
  76.     $mc->addServer($value['ip'], $value['port']); 
  77.    } 
  78.    $this->_memcached = $mc
  79.   } 
  80.   public function __destruct() 
  81.   { 
  82.     Zend_Session::writeClose(); 
  83.   } 
  84.   /** 
  85.    * Set session lifetime and optional whether or not the lifetime of an existing session should be overridden 
  86.    * 
  87.    * $lifetime === false resets lifetime to session.gc_maxlifetime 
  88.    * 
  89.    * @param int $lifetime 
  90.    * @param boolean $overrideLifetime (optional) 
  91.    * @return Zend_Session_SaveHandler_Memcached 
  92.    */ 
  93.   public function setLifetime($lifetime$overrideLifetime = null) 
  94.   { 
  95.     if ($lifetime < 0) { 
  96.       /** 
  97.        * @see Zend_Session_SaveHandler_Exception 
  98.        */ 
  99.       require_once 'Zend/Session/SaveHandler/Exception.php'
  100.       throw new Zend_Session_SaveHandler_Exception(); 
  101.     } else if (emptyempty($lifetime)) { 
  102.       $this->_lifetime = (int) ini_get('session.gc_maxlifetime'); 
  103.     } else { 
  104.       $this->_lifetime = (int) $lifetime
  105.     } 
  106.     if ($overrideLifetime != null) { 
  107.       $this->setOverrideLifetime($overrideLifetime); 
  108.     } 
  109.     return $this
  110.   } 
  111.   /** 
  112.    * Retrieve session lifetime 
  113.    * 
  114.    * @return int 
  115.    */ 
  116.   public function getLifetime() 
  117.   { 
  118.     return $this->_lifetime; 
  119.   } 
  120.   /** 
  121.    * Set whether or not the lifetime of an existing session should be overridden 
  122.    * 
  123.    * @param boolean $overrideLifetime 
  124.    * @return Zend_Session_SaveHandler_Memcached 
  125.    */ 
  126.   public function setOverrideLifetime($overrideLifetime
  127.   { 
  128.     $this->_overrideLifetime = (boolean) $overrideLifetime
  129.     return $this
  130.   } 
  131.   public function getOverrideLifetime() 
  132.   { 
  133.     return $this->_overrideLifetime; 
  134.   } 
  135.   /** 
  136.    * Retrieve session lifetime considering 
  137.    * 
  138.    * @param array $value 
  139.    * @return int 
  140.    */ 
  141.   public function open($save_path$name
  142.   { 
  143.     $this->_sessionSavePath = $save_path
  144.     $this->_sessionName   = $name
  145.     return true; 
  146.   } 
  147.   /** 
  148.    * Retrieve session expiration time 
  149.    * 
  150.    * @param * @param array $value 
  151.    * @return int 
  152.    */ 
  153.   public function close() 
  154.   { 
  155.     return true; 
  156.   } 
  157.   public function read($id
  158.   { 
  159.     $return = ''
  160.     $value = $this->_memcached->get($id); //获取数据 
  161.     if ($value) { 
  162.       if ($this->_getExpirationTime($value) > time()) { 
  163.         $return = $value['data']; 
  164.       } else { 
  165.         $this->destroy($id); 
  166.       } 
  167.     } 
  168.     return $return
  169.   } 
  170.   public function write($id$data
  171.   { 
  172.     $return = false; 
  173.     $insertDate = array('modified' => time(), 
  174.                'data'   => (string) $data); 
  175.       $value = $this->_memcached->get($id); //获取数据 
  176.     if ($value) { 
  177.       $insertDate['lifetime'] = $this->_getLifetime($value); 
  178.       if ($this->_memcached->replace($id,$insertDate)) { 
  179.         $return = true; 
  180.       } 
  181.     } else { 
  182.       $insertDate['lifetime'] = $this->_lifetime; 
  183.       if ($this->_memcached->add($id$insertDate,false,$this->_lifetime)) { 
  184.         $return = true; 
  185.       } 
  186.     } 
  187.     return $return
  188.   } 
  189.   public function destroy($id
  190.   { 
  191.     $return = false; 
  192.     if ($this->_memcached->delete($id)) { 
  193.       $return = true; 
  194.     } 
  195.     return $return
  196.   } 
  197.   public function gc($maxlifetime
  198.   { 
  199.     return true; 
  200.   } 
  201.   protected function _getLifetime($value
  202.   { 
  203.     $return = $this->_lifetime; 
  204.     if (!$this->_overrideLifetime) { 
  205.       $return = (int) $value['lifetime']; 
  206.     } 
  207.     return $return
  208.   } 
  209.   protected function _getExpirationTime($value
  210.   { 
  211.     return (int) $value['modified'] + $this->_getLifetime($value); 
  212.   } 

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

  1. $config = array
  2.   'memcached'=> array
  3.     array
  4.       'ip'=>'192.168.0.1'
  5.       'port'=>11211 
  6.     ) 
  7.   ), 
  8.   'lifetime' =>123334 
  9. ); 
  10. //create your Zend_Session_SaveHandler_DbTable and 
  11. //set the save handler for Zend_Session 
  12. Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_Memcached($config)); 
  13. //start your session! 
  14. Zend_Session::start(); 

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

Tags: Framework session memcache

分享到: