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

时间:2017-10-27 09:03:43

标签: php redis zend-framework2

我们的一个应用程序有2个服务器实例。我们使用Redis访问两台服务器的会话。 当我使用电子邮件和密码登录网站时,我被重定向到登录页面,我不得不再次输入凭据,以便我可以访问模块。一般来说,我必须登录两次。

这是Login Controller中的代码,两个服务器都具有相同的代码:

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;
}

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

1 个答案:

答案 0 :(得分:1)

所以基本上,使用Redis进行会话存储根本不会以这种方式工作......

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

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

因此,如果它有效,它只表示您总是被定向在同一台服务器上,或者您的php.ini也被配置为在redis或memcached服务器中写入。

对于"每两次登录一次",如果你遵循你的代码,它来自于第一次围绕缓存是空的,因此进入else(上面的代码),并添加缓存的详细信息。第二次,细节被缓存,因此进入if并重定向。

您可以查看这个数字海洋教程use redis for php sessions storage,并确保不要在Zend会话配置中覆盖这些设置(在配置文件或您使用的任何Module类中应用

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