Zend \ Session \ SessionManager和cookie_lifetime

时间:2013-05-15 14:23:09

标签: php zend-framework2 session-timeout

我看到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并且到期为止一年。

然而,即使cookie仍然存在,会话仍会在30分钟左右后到期。

我想要的是cookie和会话持续一年。如何在ZF2中完成此任务?

1 个答案:

答案 0 :(得分:3)

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

我没有看到\ Zend \ Session \ SessionManager中调用ini_set()的位置。

我认为解决方案是执行以下操作之一:

  1. 编辑php.ini并全局设置值
  2. 编辑.htaccess并添加php_value session.gc_maxlifetime
  3. 如果提供了gc_maxlifetime选项,则扩展\ Zend \ Session \ SessionManager并添加一个调用ini_set()的新方法。