預設 Zend Framework 僅支援檔案與資料庫儲存 Session,若需跨伺服器共享 Session 或提升效能,將 Session 寫入 Memcache 是最佳選擇。本文提供完整的 Zend_Session_SaveHandler_Memcached 實作類別與設定範例。
建立 library/Zend/Session/SaveHandler/Memcached.php,實作 Zend_Session_SaveHandler_Interface 介面,核心方法包含 read、write、destroy、gc 等:
<?php
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 $_memcached;
public function __construct($config) {
// 解析設定陣列,建立 Memcache 連線
if ($config instanceof Zend_Config) $config = $config->toArray();
foreach ($config as $key => $value) {
switch ($key) {
case self::MEMCACHED:
$this->createMemcached($value);
break;
case self::LIFETIME:
$this->setLifetime($value);
break;
case self::OVERRIDE_LIFETIME:
$this->setOverrideLifetime($value);
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) {
$value = $this->_memcached->get($id);
if ($value && $this->_getExpirationTime($value) > time()) {
return $value['data'];
}
return '';
}
public function write($id, $data) {
$insertData = ['modified' => time(), 'data' => (string)$data];
$value = $this->_memcached->get($id);
if ($value) {
$insertData['lifetime'] = $this->_getLifetime($value);
return $this->_memcached->replace($id, $insertData);
} else {
$insertData['lifetime'] = $this->_lifetime;
return $this->_memcached->add($id, $insertData, false, $this->_lifetime);
}
}
public function destroy($id) {
return $this->_memcached->delete($id);
}
public function gc($maxlifetime) { return true; }
// ... 輔助方法 _getLifetime, _getExpirationTime 省略 ...
}
?>
在 Bootstrap 或啟動腳本中設定 SaveHandler 並啟動 Session:
<?php
$config = [
'memcached' => [
['ip' => '192.168.0.1', 'port' => 11211],
['ip' => '192.168.0.2', 'port' => 11211] // 支援多台分散式
],
'lifetime' => 123334
];
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_Memcached($config));
Zend_Session::start();
?>
memcache 擴充套件(非 memcached)。$_SESSION 完全相同。