会话的持久性 Symfony 3

Persistence of sessions Symfony 3

我想 "identify" 匿名用户访问网站页面填写表格。事实上,对于某些统计数据,我们需要知道有多少连接取决于用户填写表单的距离。

为了识别那些用户,我考虑过使用 Apache 创建的密钥来识别连接后的会话。

  1. 我不确定是否可以在 Symfony 应用程序中获取 Apache 会话信息(特别是密钥)....

所以我会使用 Symfony 3 中新增的 sessionInterface。

我可以毫无问题地将此对象注入到我的控制器操作中。问题是没有会话开始,所以没有信息可以获取,但是会话对象上的一些一般信息,这很清楚:

protected 'started' => boolean false

如果我写:

public function indexAction(SessionInterface $session) {
    $session->start();
    $session_id = $this->get('session')->getId();
    ....
}

我可以获得一个标识密钥(可能与 Apache 会话密钥不同)但是每次用户按 F5 时都会创建一个新会话。

也许答案就在某些配置中。

我想为每个连接到该站点的用户获取这个特殊密钥(Apache 或 Symfony),会话应与 Apache 上的会话保持相同,如果用户关闭浏览器或保持不活动状态超过 ...(参见 apache 和 php 配置文件)。

我应该在哪里开始会话,或者它可以在用户连接时自动开始吗?

感谢您的帮助。

注:与其他无关post。在说它与另一个问题相同之前最好先阅读问题。

注意:

在那之后我尝试做的事情。

config.yml :

session:
    enabled: true
    handler_id: session.handler.native_file
    save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'
    name: soda
    cookie_lifetime: 0

控制器:

public function indexAction(Request $request, SessionInterface $session) 
{
    $session_id = null;
    $cookies = $request->cookies;
    if(!$session->isStarted()) {
        print("session not started");
    } else {
        print("session started");
    }

    if($cookies->has('soda')) {
        print("cookie here");
        $session_id = $cookies->get('soda');
    } else if(!$session->isStarted()) {
            print("cookie not here...starting session");
            $session->start();
            $session_id = $session->getId();
    } else {
        print("cookie not here");
    }

    $response = $this->render('@my.twig', array(
        'session_id' => $session_id
    ));

    print_r($session_id);
    print_r($session->getId());

    $response->headers->setCookie(new Cookie('soda', $session_id));

    return $response;
}

第一次访问网站:

session not started
cookie not here...starting session
9hec8bd0t7qjr29ji6fuf5 / 9hec8bd0t7qjr29ji6fuf5

我按 F5 :

session started
cookie here
9hec8bd0t7qjr29ji6fuf5 / m6alskkqmlf8pt6e1vulj3c8o6 

所以这次会话开始进入控制器但是显然它已经重新启动了!似乎在每个请求上。

如何使用您的

生成的会话 ID 创建一个 cookie?
$session->start();
$session_id = $this->get('session')->getId();

然后您可以将其存储在您的数据库中(通过创建 Visitor class.

当页面重新加载时,检查cookie是否存在并将其与数据库匹配。

我希望这对发生在他们身上的人有所帮助。我找到了解决方案,但我仍然不知道为什么它会这样工作:

config.yml:

framework:
  session:
    enabled: true
    handler_id: session.handler.native_file
    save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'
    name: myCookie
    cookie_lifetime: 0

在控制器中:

public function indexAction(Request $request, SessionInterface $session) {
   $cookies = $request->cookies;
   $session_id = null;

   if($cookies->has('myCookie')) {
      $session_id = $cookies->get('myCookie');
   } else if (!$session->isStarted() {
      $session->start();
      $session_id = $session->getId();
      $session->set('myCokie', new Cookie('myCookie', $session_id);
   }

   $response = $this->render ......

   $response->headers->setCookie(new Cookie('myCookie', $session_id));

   return $response;
}