会话的持久性 Symfony 3
Persistence of sessions Symfony 3
我想 "identify" 匿名用户访问网站页面填写表格。事实上,对于某些统计数据,我们需要知道有多少连接取决于用户填写表单的距离。
为了识别那些用户,我考虑过使用 Apache 创建的密钥来识别连接后的会话。
- 我不确定是否可以在 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;
}
我想 "identify" 匿名用户访问网站页面填写表格。事实上,对于某些统计数据,我们需要知道有多少连接取决于用户填写表单的距离。
为了识别那些用户,我考虑过使用 Apache 创建的密钥来识别连接后的会话。
- 我不确定是否可以在 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;
}