Php Zend\Session\SessionManager和cookie\u生命周期

Php Zend\Session\SessionManager和cookie\u生命周期,php,zend-framework2,session-timeout,Php,Zend Framework2,Session Timeout,我在ZF2会话和超时中看到一些奇怪和令人沮丧的行为 下面是我用来设置会话的代码: $sessionConfig = new \Zend\Session\Config\StandardConfig(); $sessionConfig->setOptions(array( 'cache_expire' => 525949, 'cookie_domain' => 'mydomain.com', 'cookie_lifet

我在ZF2会话和超时中看到一些奇怪和令人沮丧的行为

下面是我用来设置会话的代码:

    $sessionConfig = new \Zend\Session\Config\StandardConfig();
    $sessionConfig->setOptions(array(
        'cache_expire' => 525949,
        'cookie_domain' => 'mydomain.com',
        'cookie_lifetime' => 31536000,
        'cookie_path' => '/',
        'cookie_secure' => TRUE,
        'gc_maxlifetime' => 31536000,
        'name' => 'mydomain',
        'remember_me_seconds' => 31536000,
        'use_cookies' => TRUE,
    ));

    $sessionManager = new \Zend\Session\SessionManager($sessionConfig);
    $sessionManager->rememberMe(31536000);
    $sessionManager->setSaveHandler(new \Zend\Session\SaveHandler\MongoDB($mongo, $options);
    $session = new \Zend\Session\Container('MY_SESSION', $sessionManager);
当我执行此代码时,会创建cookie,但过期时间是会话结束

如果我这样更改代码:

    $sessionManager = new \Zend\Session\SessionManager();
    $sessionManager->rememberMe(31536000);
    $sessionManager->setConfig($sessionConfig);
    $session = new \Zend\Session\Container('MY_SESSION', $sessionManager);
cookie将被创建,过期时间为一年

但是,会话在30分钟左右后仍然会过期,即使cookie仍然存在


我希望cookie和会话都能持续一年。在ZF2中如何实现这一点?

看起来这个问题与gc_maxlifetime选项的处理有关。在\Zend\Session\SaveHandler\MongoDB中,该值通过ini_get('Session.gc_maxlifest')从PHP配置中获取

我在\Zend\Session\SessionManager中找不到调用ini_set()的地方

我认为,解决办法是采取以下措施之一:

  • 编辑php.ini并全局设置该值
  • 编辑.htaccess并添加php\u value session.gc\u maxlifetime
  • 扩展\Zend\Session\SessionManager并添加一个新方法,如果提供了gc\u maxlifest选项,该方法将调用ini\u set()

  • 使用
    \Zend\Session\Config\SessionConfig
    ,而不是
    StandardConfig
    当我使用与上述相同选项的SessionConfig时,不会写入PHPSESSID cookie。我缺少什么?上面的选项表示
    mydomain
    的会话
    name
    ini\u set
    SessionConfig
    类调用,无需编辑任何内容,op只需使用正确的类即可。