无法在ZF2中延长会话超时

时间:2014-04-17 15:33:01

标签: php mongodb session zend-framework2

我将会话数据保存在我的数据库(mongodb)上,客户要求他让系统闲置2个小时(他在网站上有视频可能需要2个小时才能完成,所以他要求将会话超时值设置为2小时)。我是按照Zend Framework的建议做到的。请参阅下面的config.php

return array(
    'env2_session' => array(
        'config' => array(
            'class' => 'Zend\Session\Config\SessionConfig',
            'options' => array(
                'name' => 'test',
                'remember_me_seconds' => 7200,
                'gc_maxlifetime' => 7200,           
            ),
        ),
        'mongo_handler' => array(
            'options' => array(
                'class' => 'Zend\Session\SaveHandler\MongoDBOptions',
                'collection' => 'sessions',
            ),
        ),
        'save_handler' => 'Env2Session/Mongo/Handler',
        'validators' => array(
            array(
                'Zend\Session\Validator\RemoteAddr',
                'Zend\Session\Validator\HttpUserAgent',
            ),
        ),
    ),
);

但这不是正确的代码,因为我无法看到会话扩展。 24分钟后它仍然会超时。

如果我添加'cookie_lifetime'=>它会有效'gc_maxlifetime'=>之后的7200 7200但即使我正在使用该网站,这也会得到时间限制。

我只想在系统空闲时才进行超时。请告诉我一些事情。

这是我在Module.php中编写的保存处理程序代码


    public function getServiceConfig()
        {
            return array(
                'factories' => array(
                    'Env2Session/Mongo/Handler' => function ($sm) {
                        $config = $sm->get('config');
                        $session = $config['env2_session'];

                        $mongo = $sm->get('Env2\Mongo');

                        $class = isset($session['mongo_handler']['options']['class'])  ? $session['mongo_handler']['options']['class'] : 'Zend\Session\SaveHandler\MongoDBOptions';
                        $options = array();
                        $options['collection'] = $session['mongo_handler']['options']['collection'];
                        $options['database'] = $config['db']['mongo']['db_name'];
                        $mongoOption = new $class($options);

                        $sessionSaveHandler = new MongoDB($mongo, $mongoOption);
                        return $sessionSaveHandler;
                    },
                    'Env2Session' => function ($sm) {
                        $config = $sm->get('config');
                        if (isset($config['env2_session'])) {
                            $session = $config['env2_session'];

                            $sessionConfig = null;
                            if (isset($session['config'])) {
                                $class = isset($session['config']['class'])  ? $session['config']['class'] : 'Zend\Session\Config\SessionConfig';
                                $options = isset($session['config']['options']) ? $session['config']['options'] : array();
                                $sessionConfig = new $class();
                                $sessionConfig->setOptions($options);
                            }

                            $sessionStorage = null;
                            if (isset($session['storage'])) {
                                $class = $session['storage'];
                                $sessionStorage = new $class();
                            }
                            $sessionSaveHandler = null;
                            if (isset($session['save_handler'])) {
                                $sessionSaveHandler = $sm->get($session['save_handler']);
                            }

                            $sessionManager = new SessionManager($sessionConfig, $sessionStorage, $sessionSaveHandler);

                            if (isset($session['validator'])) {
                                $chain = $sessionManager->getValidatorChain();
                                foreach ($session['validator'] as $validator) {
                                    $validator = new $validator();
                                    $chain->attach('session.validate', array($validator, 'isValid'));
                                }
                            }
                        } else {
                            $sessionManager = new SessionManager();
                        }
                        Container::setDefaultManager($sessionManager);
                        return $sessionManager;
                    }
                ),
            );
        }

2 个答案:

答案 0 :(得分:2)

我正在努力解决zend会话超时问题。最后,我为此案例实施了自己的解决方案我设置了在每个请求期间刷新的到期时间。但是如果用户不活动,则时间将过期,会话将被销毁。

我把所有教程都放在这里:http://blog.tulikowski.com/zend-framework-2-implementation-of-session-authentication-timeouts/

答案 1 :(得分:1)

转到autoload / global.php,然后创建或编辑此密钥:

        'session_config'    =>  array
                                (
                                    'cache_expire'          =>  60*60*2,
                                    'name'                  =>  'sessionName',
                                    'cookie_lifetime'       =>  60*60*2,
                                    'gc_maxlifetime'        =>  60*60*2,
                                    'cookie_path'           =>  '/',
                                    'cookie_secure'         =>  FALSE,
                                    'remember_me_seconds'   =>  60*60*2,
                                    'use_cookies'           =>  true,
                                ),