检测 PHP 会话是否存在

56

Facebook现在向用户提供订阅功能,以便用户可以实时获得更新内容。如果我的应用程序接收到更新,我计划将其存储在数据库中。同时,我还希望检测他们的会话是否存在。如果存在,则我也可以在其中更新数据。

我的会话ID是MD5(fb_id + secret),所以我可以轻松地编辑他们的会话。问题是如何检测会话是否存在。


1
你指的是谁的会话?从哪里来的?由谁创建的? - Pekka
"secret hashed" 的意思是什么?如果它是一个正确的哈希,你无法找回 fb_id。 - NullUserException
用户会话,来自我的服务器,由我的服务器创建... 抱歉,我以为这是一个默认的。 - Pablo
1
我同意Pekka的观点,为什么你真的需要知道会话是否存在呢?如果您总是以相同的方式创建会话,难道不能只检查会话中存储的某个变量是否存在吗?这很简单,只需使用 isset($_SESSION['var']) 即可。 - animuson
据我了解,会话在 x 分钟的活动后被删除。所以我的问题是,如何检测该用户是否有活动会话。我能想到的唯一方法是:session_id(md5(facebook_id+secret)); session_start(); if (!empty($_SESSION)) {//有会话} - Pablo
显示剩余2条评论
7个回答

73

我使用的是组合版本:

if(session_id() == '' || !isset($_SESSION) || session_status() === PHP_SESSION_NONE) {
    // session isn't started
    session_start();
}

44

如果使用$_SESSION(或者对于PHP 4.0.6或更低版本的$HTTP_SESSION_VARS),请使用isset()函数检查变量是否已在$_SESSION中注册。

isset($_SESSION['varname'])

我想这会帮助其他人找到这个答案:http://php.net/manual/en/function.isset.php - Jace
1
截至2022年4月,您提供的链接已经失效。 - Zakk

34
如果您正在使用 PHP 5.4 或更高版本,建议使用 session_status() 函数来实现会话状态的检查。
if (session_status() == PHP_SESSION_ACTIVE) {
  echo 'Session is active';
}
  • PHP_SESSION_DISABLED 如果会话被禁用。
  • PHP_SESSION_NONE 如果会话已启用但不存在。
  • PHP_SESSION_ACTIVE 如果会话已启用且存在。

1
为什么要使用比较运算符==而不是身份运算符===?两者都返回整数... - Mike Casan Ballester
2
@micaball == 运算符表示“相等的值”。=== 运算符表示“相等的值和类型”。在这个比较中,我们只关注 true/false 值,所以 == 是更好的选择。 - elbrant
3
@micaball 太多的 PHP 函数可以返回混合值类型(经典的例子是 strpos())。在这种情况下,检查值类型实际上是有意义的。session_status() 总是返回一个 int,所以没有必要。 :) - Toto
session_status() 返回状态的数字值,因此我需要进行微调: session_status() == 3 - Chris Lambrou
@ChrisLambrou 常量被定义为数字值。如果您没有匹配到所列出的常量中的任何一个数字,除非您在使用非标准或旧版本的 PHP(5.4 之前),否则您可能设置有误,这可能解释了为什么您的常量未被正确定义。 - Jeff Clayton

2

如何检查SESSION是否存在?

答案:

isset($_SESSION['variable_name'])

例子:

isset($_SESSION['id'])

1
function is_session_started()
{
    if ( php_sapi_name() !== 'cli' ) {
        if ( version_compare(phpversion(), '5.4.0', '>=') ) {
            return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
        } else {
            return session_id() === '' ? FALSE : TRUE;
        }
    }
    return FALSE;
}

// Example
if ( is_session_started() === FALSE ) session_start();

即使是简短的描述,您也应该添加一些说明来配合您的代码。仅发布没有解释的代码是不被看好的 :) - MBorg
公平地说,这段代码本身就很容易理解。感谢您提供的片段。 - s3c

0

最短且简单的答案

$_SESSION['variable_name']?? die;

这是一种简单的方法

if(isset($_session['variable'])){
      // do something
 }else{
     die;
 }

0

原始代码来自Sabry Suleiman

稍微美化了一下:

function is_session_started() {

    if ( php_sapi_name() === 'cli' )
        return false;

    return version_compare( phpversion(), '5.4.0', '>=' )
        ? session_status() === PHP_SESSION_ACTIVE
        : session_id() !== '';
}

第一个条件检查正在使用的服务器API。如果使用命令行界面,则函数返回false。

然后,我们根据正在使用的PHP版本返回布尔结果。

在古代历史上,您只需要检查session_id()。如果它是空字符串,则会话未启动。否则就是已经启动了。

从5.4到至少当前的8.0,通常是检查session_status()。如果不是PHP_SESSION_ACTIVE,那么会话尚未启动(PHP_SESSION_NONE),或者根本无法使用会话(PHP_SESSION_DISABLED)。


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