Zend Framework 原生支援資料庫存儲 Session,但缺乏 Memcached 適配器。本文提供完整的 Zend_Session_SaveHandler_Memcached 實現,支援多伺服器分布式部署。
文件位置:Zend/Session/SaveHandler/Memcached.php,實現 Zend_Session_SaveHandler_Interface。
class Zend_Session_SaveHandler_Memcached implements Zend_Session_SaveHandler_Interface {
const LIFETIME = 'lifetime';
const OVERRIDE_LIFETIME = 'overrideLifetime';
const MEMCACHED = 'memcached';
protected $_lifetime, $_overrideLifetime, $_memcached;
public function __construct($config) {
if ($config instanceof Zend_Config) $config = $config->toArray();
foreach ($config as $k=>$v) {
switch ($k) {
case self::MEMCACHED: $this->createMemcached($v); break;
case self::LIFETIME: $this->setLifetime($v); break;
case self::OVERRIDE_LIFETIME: $this->setOverrideLifetime($v); break;
}
}
}
public function createMemcached($config) {
$mc = new Memcache;
foreach ($config as $server) $mc->addServer($server['ip'], $server['port']);
$this->_memcached = $mc;
}
public function read($id) {
$val = $this->_memcached->get($id);
if ($val && $this->_getExpirationTime($val) > time()) return $val['data'];
if ($val) $this->destroy($id);
return '';
}
public function write($id, $data) {
$insert = array('modified'=>time(), 'data'=>(string)$data);
$val = $this->_memcached->get($id);
$insert['lifetime'] = $val ? $this->_getLifetime($val) : $this->_lifetime;
return $val ? $this->_memcached->replace($id, $insert) : $this->_memcached->add($id, $insert, false, $this->_lifetime);
}
public function destroy($id) { return $this->_memcached->delete($id); }
public function gc($maxlifetime) { return true; }
// 輔助方法 _getLifetime, _getExpirationTime, setLifetime, setOverrideLifetime 等...
}
$config = array(
'memcached' => array(
array('ip'=>'192.168.0.1', 'port'=>11211)
),
'lifetime' => 123334
);
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_Memcached($config));
Zend_Session::start();
支援多台 Memcached 伺服器自動分布式存儲。
配置完成後,Zend_Session 所有操作(讀寫銷毀)自動走 Memcached,業務代碼無需任何修改。
更多 Zend 相關技術請參考專題:《Zend Framework 入門教程》、《PHP 優秀開發框架總結》、《Yii 框架入門及常用技巧總結》、《ThinkPHP 入門教程》、《PHP 面向對象程序設計入門教程》、《PHP+MySQL 數據庫操作入門教程》及《PHP 常見數據庫操作技巧匯總》。