真正摧毁一个PHP会话?

我已经听到这个话题的混合回应,那么一个确定的方法来销毁一个PHP会话?

session_start(); if(isset($_SESSION['foo'])) { unset($_SESSION['foo']; ... } session_destroy(); 

在最简单的情况下,是否足以真正终止用户和服务器之间的会话?

要摧毁一个会议,你应该采取以下步骤:

  • 删除会话数据
  • 使会话ID无效

要做到这一点,我会用这个:

 session_start(); // resets the session data for the rest of the runtime $_SESSION = array(); // sends as Set-Cookie to invalidate the session cookie if (isset($_COOKIE[session_name()])) { $params = session_get_cookie_params(); setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], isset($params['httponly'])); } session_destroy(); 

为了确保会话ID无效,您应该只允许由您的脚本启动的会话ID。 所以设置一个标志,并检查是否设置:

 session_start(); if (!isset($_SESSION['CREATED'])) { // invalidate old session data and ID session_regenerate_id(true); $_SESSION['CREATED'] = time(); } 

另外,您可以使用此时间戳定期交换会话ID以减less其生命周期:

 if (time() - $_SESSION['CREATED'] > ini_get('session.gc_maxlifetime')) { session_regenerate_id(true); $_SESSION['CREATED'] = time(); } 

PHP手册解决了这个问题。

您需要终止会话,并删除会话cookie(如果您使用cookie)。

看到这个页面(特别是第一个例子):

http://us2.php.net/manual/en/function.session-destroy.php

在我使用PHP会话的一个站点中,我从来没有真正销毁会话。

问题是,你几乎不得不调用session_start()来检查你的$_SESSIONvariables,在这一点上,瞧,你已经创build了另一个会话。

因此,在我的网站,我只是确保每个页面调用session_start() ,然后只是unset()会话状态的那些部分在用户注销时很重要。