Cookie的生命周期(会话ID)?关闭浏览器后删除+错误:由于已经发送了标头,因此无法启动会话

时间:2013-01-27 08:35:09

标签: php session cookies symfony symfony-2.1

我想在cookie中存储用户的会话ID。

所以我写了这段代码:

public function indexAction()
{
    $session_id = $this->get('session')->getId();
    $request = $this->get('request');
    $value = $request->cookies->get('session_id');
    if ($value == null)//if cookie session_id does not exist, we create it
    {
        $cookie = new Cookie('session_id', $session_id, time() + (3600 * 24 * 7));
        $response = new Response();
        $response->headers->setCookie($cookie);
        $response->send();
    }
    else echo 'A cookie session_id has already been set :' . $value;

    return $this->render('MyBundle:Default:index.html.twig');
}


1.首先,我不知道在哪里放这个代码。我不认为把它放在indexAction中是正确的。

2.存储会话ID的cookie PHPSESSID已存在。更改它的到期时间而不是创建一个新的更好吗?如何更改其到期时间呢?

3.要更改我的cookie session_id的到期时间,我试过:

  • $cookie = new Cookie('session_id', $session_id, time() + (3600 * 24 * 7));
  • 并在config.yml中设置,在会话下方,生命周期为604800。

4.当我重新打开浏览器时,我也收到以下错误:Failed to start the session because headers have already been sent.这似乎是由于此次调用$this->get('session')以及此行:$response->send();但我不是&#39我怎么能以另一种方式做到这一点。

但这不起作用:当我关闭浏览器并重新打开它时,我定义的所有cookie都已消失,PHPSESSID有一个新值。

1 个答案:

答案 0 :(得分:0)

您可以在框架部分下的配置文件中设置会话生命周期。 config.yml的示例可能如下所示:

framework:
secret:        %secret%
charset:       UTF-8
error_handler: null
csrf_protection:
  enabled: true
router:        { resource: "%kernel.root_dir%/config/routing.yml" }
validation:    { enabled: true, annotations: true }
templating:    { engines: ['twig'] } #assets_version: SomeVersionScheme
session:
  default_locale: %locale%
  lifetime:       3600
  auto_start:     true

您可以在此处找到更多信息:http://forum.symfony-project.org/viewtopic.php?f=23&t=34110