繁体   English   中英

如何使用Zend 2在Redis中存储会话

[英]How to store session in Redis using Zend 2

我们的应用程序之一有2个服务器实例。 我们使用Redis访问两个服务器的会话。 当我使用电子邮件和密码登录站点时,我又被重定向到登录页面,并且我必须再次输入凭据才能访问模块。 通常,我必须登录两次。

这是登录控制器中的代码,并且两个服务器具有相同的代码:

public function indexAction()
{
    $form = new LoginForm();
    $form->get('submit')->setValue('Login');
    $messages = null;
    //considering redis() and server were declared already
    $redis = $this->redis();
    $server = $this->getServer();
    $request = $this->getRequest();

    if ($request->isPost()) {

        $form->setInputFilter(new LoginFilter($this->getServiceLocator()));
        $form->setData($request->getPost());
        if ($form->isValid()) {

            $data = $form->getData();
            $admin = 0; 
            $user = $this->getEntityManager()->getRepository('\Admin\Entity\User');

            $userDetail = $user->getUseCompanyByUsername($data['email']);


            if(isset($userDetail) && !empty($userDetail)){
                $companyCompanyTypeRepo = $this->getEntityManager()->getRepository('\Admin\Entity\CompanyCompanyType');
                $companyCompanyType = $companyCompanyTypeRepo->getCompanyCompanyTypeByCompanyId($userDetail[0]['company_id']);

                foreach ($companyCompanyType as $key) {
                    if(strtolower($key['name'])=='admin'){
                       $admin=1; 
                    }
                }
                // begin here
                if($admin==1){
                    $authService = $this->getServiceLocator()->get('Zend\Authentication\AuthenticationService');

                    $adapter = $authService->getAdapter();
                    $adapter->setIdentityValue($data['email']); 
                    $adapter->setCredentialValue($data['password']); 
                    $authResult = $authService->authenticate();

                    if ($authResult->isValid()) {
                        $identity = $authResult->getIdentity();
                        $authService->getStorage()->write($identity);
                        $time = 1209600; // 14 days 1209600/3600 = 336 hours => 336/24 = 14 days
                        if ($data['rememberme']) {
                            $sessionManager = new \Zend\Session\SessionManager();
                            $sessionManager->rememberMe($time);
                        }
                        //store user info in session
                        $this->sessionContainer = new Container('user_info');
                        $this->sessionContainer->user_info = $userDetail;


                        if ($redis->hasItem('user_' . $data['email'] .'_' . $server)) {

                            return $this->redirect()->toRoute('home', array('controller' => 'index', 'action' => 'index'));

                        } else {

                            $redis->getOptions()->setTtl(7200);
                            $redis->setItem('user_' . $data['email'] .'_' . $server, serialize($this->sessionContainer->user_info));

                        }



                    }

                    foreach ($authResult->getMessages() as $message) {
                        $messages .= "$message\n"; 
                    }   
                }    
                else
                {
                    $messages="The credential supplied has no access to this portal.";
                }
                // end here
            }else{
                $messages="Your authentication credentials are not valid.";  
            }
        }
    }

    $view =  new ViewModel(array(
            'error' => 'Your authentication credentials are not valid',
            'form'    => $form,
            'messages' => $messages,
         ));

    return $view;
}

您知道什么地方可能出问题吗? 这对我来说是新的。 非常感谢你的帮助。

因此,基本上,使用Redis进行会话存储根本无法通过这种方式进行...

您遇到的第一个问题是redis不用于存储会话,它用于存储给定时间的用户详细信息的副本:

$redis->getOptions()->setTtl(7200);
$redis->setItem('user_' . $data['email'] .'_' . $server, serialize($this->sessionContainer->user_info));

因此,如果工作正常,则仅意味着您始终被定向在同一服务器上,或者php.ini也配置为在redis或memcached服务器中编写。

对于“每两个登录一次”,如果您遵循代码,则其原因是缓存周围的第一次空间为空,因此进入else(上面的代码),并将详细信息添加到缓存中。 第二次,详细信息被缓存,因此进入if并被重定向。

您可以看一下此数字海洋教程,以将Redis用于php会话存储 ,并确保您不覆盖Zend Session配置中的这些设置(在配置文件或应用程序中使用的任何Module类中)。

然后,您将能够删除实际上无法正常工作的缓存,并且绝对不能删除您认为应该的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM