ZF3会话超时问题

4

我一直遇到使用Zend Framework 3时与会话超时相关的问题。会话在5-10分钟内过期。我使用了会话的默认代码,Zf3骨架提供的在global.php中如下所示。

// Session configuration.
'session_config' => [   
  'cookie_lifetime' => 60*60*1, // Session cookie will expire in 1 hour.
  'gc_maxlifetime' => 60*60*1,  // Store session data on server maximum for 1 hour. 
],

// Session manager configuration. 
'session_manager' => 
[
   'validators' => [
      RemoteAddr::class,
      HttpUserAgent::class,
    ]
],

// Session storage configuration.
'session_storage' => [
   'type' => SessionArrayStorage::class 
],

即使使用上面的代码,会话仍在5-10分钟内过期。我想将会话过期时间延长到30分钟以上。如何在Zf3中进行配置?

请提供解决方案。

1个回答

1
你的会话管理器设置是正确的,但这并不足以将这些会话设置用作默认设置。
我的假设是你没有将此会话管理器设为默认。为了使其成为默认值,你需要尽早实例化它。 一个解决方案是在模块 Module.php 中进行。
use Zend\Mvc\MvcEvent;
use Zend\Session\SessionManager;

class Module
{
    //...

    /**
     * This method is called once the MVC bootstrapping is complete. 
     */
    public function onBootstrap(MvcEvent $event)
    {
        $application = $event->getApplication();
        $serviceManager = $application->getServiceManager();

        // The following line instantiates the SessionManager and automatically
        // makes the SessionManager the 'default' one.
        $sessionManager = $serviceManager->get(SessionManager::class);
    }
}

参考

编辑:我的第二个假设是您使用全局路径进行会话(例如/var/lib/php/sessions)。

在Debian中,有一个cron可以根据php.ini会话设置清除会话(/etc/cron.d/php)。

此cron使用您的php.ini“gc_maxlifetime”,并可能清除您的会话。

要查找保存会话的位置,请使用session_save_path()。检查该目录以获取您的会话。

为了克服这个问题,您应该设置"save_path",并且此路径不应与服务器上的其他应用程序或脚本共享(您不希望另一个脚本使用全局gc设置或其自己的设置来删除您的会话)。

添加

'save_path'           =>   '/path/to/app/data/sessions'

在你的“session_config”数组中。

使用上述代码后,会话仍在5-10分钟内过期。请提供解决方案。 我是否错过了任何会话配置? - Ohm
你能在使用会话的地方添加代码吗?并且告诉我它是如何过期的? - Jannes Botis
你想做什么?是一个会过期的用户登录吗?如果是,你能添加一下用户登录的代码吗? - Jannes Botis
我想要一个至少30分钟的登录会话。 我使用了https://github.com/olegkrivtsov/using-zf3-book-samples/blob/master/userdemo/module/User/src/Controller/AuthController.php上的代码。 - Ohm
你能否尝试在设置中设置save_path并测试是否可以正常工作:'session_config' => [ 'cookie_lifetime' => 60601, 'gc_maxlifetime' => 60601, 'save_path' => '/path/to/session' ] 将 /path/to/session 更改为本地路径,例如 userdemo/data/session,并确保该路径可被您系统中的 Apache 用户写入? - Jannes Botis
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接