【发布时间】:2012-08-28 13:05:44
【问题描述】:
我正在尝试更改 Zend_Auth 的会话后端。但是没能成功。 在我的 bootstrap.php 中;
$oBackend = new Zend_Cache_Backend_Libmemcached(
array(
'servers' => $servers,
'compression' => false
) );
// configure caching frontend strategy
$oFrontend = new Zend_Cache_Core(
array(
'caching' => true,
'automatic_serialization' => true
) );
// build a caching object
$cache = Zend_Cache::factory( $oFrontend, $oBackend );
$saveHandler = new \Application\Auth\Adapter\Memcached();
$saveHandler->setCacher($cache);
\Zend_Session::setSaveHandler($saveHandler);
它成功保存了 Memcache 的值,没有问题。我测试一下;
$namespace = new Zend_Session_Namespace();
$namespace->name = "Fatih";
在其他控制器中;
$ns = new Zend_Session_Namespace();
var_dump($ns->name);
没关系,但我在 Memcache 中看不到 Zend_Auth 值。但是如果我var_dump($_SESSION)
我可以看到它像;
["Zend_Auth"]=> array(1) { ["storage"]=> object(Application_Security_Auth_Storage)#66 (1) { ["_user":protected]=> object(Application_Security_Auth_User)#84 (4) { ["id":protected]=> object(MongoId)#87 (1) { ["$id"]=> string(24) "4fcca6b8c863c79d33000004" } ["username":protected]=> string(5) "admin" ["role":protected]=> string(5) "admin" ["fullname":protected]=> NULL } } }
这里可以看到我的登录方式;
public function login($username, $password)
{
if ($username == "" || $password == "")
return false;
$adapter = new \Application_Security_Auth_Adapter();
$adapter->setIdentity($username);
$adapter->setCredential($password);
$auth = \Zend_Auth::getInstance();
$result = $auth->authenticate($adapter);
return $result->isValid();
}
【问题讨论】:
-
Ok 原来是我们的清漆服务器是问题的原因。对 url 的简单管道已修复。
-
我不会将会话数据存储到 memcached 中,不能保证它会保留在那里。
-
好的,我明白了,你会用什么来解决这种问题?假设 4 个网络服务器需要共享会话数据..
-
几种可能的解决方案:1) 负载平衡和粘性会话 - 将带有服务器 ID 的 cookie 添加到请求中 - 然后每个服务器管理自己的会话 2) 将会话存储到数据库中 3) 将会话数据存储到 NFS - 共享所有服务器的存储 4) 将所有必要的会话数据存储到 cookie
-
将会话存储到memache with write-thru 到数据库,以便可靠地共享会话数据。
标签: php zend-framework zend-auth zend-session