【问题标题】:Change Zend_Auth storage backend $_SESSION to Memcached将 Zend_Auth 存储后端 $_SESSION 更改为 Memcached
【发布时间】: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


【解决方案1】:

我不知道这是否有任何帮助,但是 Zend_auth 会自动创建存储事物,您可以使用它从任何地方访问它

$session = new Zend_Session_Namespace('Zend_Auth');
$session->storage->//here goes your property like user id password etc

现在,如果您使用 Zend_Auth,它将使用 Zend_Auth_Storage_Session 默认值“Zend_Auth”作为 Zend_Session_Namespace。现在要更改使用的命名空间,请修改 Zend_Auth_Storage_Session 中的默认值,否则如果您想缓存此信息或将其存储在其他地方,您可以随时访问它并将其移动到您想要的位置。

现在我希望我能帮上忙,但我对内存缓存一无所知

【讨论】:

    【解决方案2】:

    我认为这是最简单的方法,它会为你工作

    Dear Use User This Class For Zend Framework For Session.

    使用 Zend\Session\Container;

    然后执行以下过程以从 Seesions 中获取值。

        $user_session = new Container('user_login');
        $loginUser = $user_session->login_user['user_type'];
    

    $user_session->login_user 在这个变量中我存储所有与用户相关的信息数组,如用户类型、用户电子邮件、用户 ID 等...然后我在每个页面上获取此会话值...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 2016-06-24
      • 2016-08-21
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多