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支持,因为字符长度限制,我把部分注释去掉了):
- 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 (emptyempty($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的使用方法和以前一样,不用管底层是怎么实现的!
Tags: Framework session memcache
相关文章
- ·zend framework 实例(2013-11-14)
- ·Zend Framework 配置与应用(2013-11-14)
- ·zend framework Invalid command RewriteEngine(2014-08-04)
- ·Zend Framework页面缓存实例(2021-03-02)
- ·zend framework框架中url大小写问题解决方法(2021-04-03)
- ·Zend Framework+smarty用法实例详解(2021-07-18)
- ·Zend Framework连接Mysql数据库实例分析(2021-07-18)
- ·Zend Framework缓存Cache用法简单实例(2021-07-18)
- ·Zend Framework入门知识点小结(2021-07-18)
- ·Zend Framework教程之Zend_Db_Table用法详解(2021-07-18)
- ·Zend Framework教程之Zend_Db_Table_Row用法实例分析(2021-07-20)
- ·Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析(2021-07-20)
- ·Zend Framework实现多文件上传功能实例(2021-07-20)
- ·Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法(2021-07-20)
- ·Zend Framework分页类用法详解(2021-07-20)
- ·Zend Framework框架路由机制代码分析(2021-07-20)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)