检测 PHP 会话是不是存在

Posted

技术标签:

【中文标题】检测 PHP 会话是不是存在【英文标题】:Detect if PHP session exists检测 PHP 会话是否存在 【发布时间】:2011-04-02 02:20:24 【问题描述】:

Facebook 现在向用户提供订阅服务,因此您可以实时了解更改。如果我的应用收到更新,我计划将其存储在数据库中。我还想检测他们的会话是否存在。如果是这样,那么我也可以更新那里的数据。

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

【问题讨论】:

你指的是谁的会话?从哪里?由谁创建? “秘密哈希”是什么意思?如果它是正确的哈希,则无法取回 fb_id。 用户会话,来自我的服务器,由我的服务器创建......对不起,我认为这是给定的 @Pablo 如果你的服务器已经创建了一个会话,你为什么需要我们的帮助来检测它是否存在?我不明白。你的意思是你收到更新的用户是否有你的会话?只有你的用户管理才能知道,不是吗? 我同意 Pekka,为什么你真的需要知道会话是否存在?如果您总是以相同的方式创建会话,您不能只检查会话中存储的某个变量是否存在吗?真的很简单isset($_SESSION['var']) 【参考方案1】:

我使用组合版本:

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

【讨论】:

【参考方案2】:

原代码来自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() !== '';

第一个条件检查正在使用的Server API。如果使用命令行接口,函数返回false。

然后我们根据使用的PHP version 返回布尔结果。

在古代历史中,您只需检查session_id()。如果它是一个空字符串,则不会启动会话。否则就是这样。

从 5.4 到至少当前的 8.0,标准是检查 session_status()。如果不是 PHP_SESSION_ACTIVE,则会话尚未开始 (PHP_SESSION_NONE) 或会话完全不可用 (PHP_SESSION_DISABLED)。

【讨论】:

【参考方案3】:

使用哪种方法来检查 SESSION 是否存在? 答:

isset($_SESSION['variable_name'])

例子:

isset($_SESSION['id'])

【讨论】:

【参考方案4】:
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();

【讨论】:

你应该添加一个描述来配合你的代码,即使是简短的。没有解释的只是代码的帖子不受欢迎:) 公平地说,代码几乎是不言自明的。谢谢你的sn-p。【参考方案5】:

如果你使用的是 php 5.4+,使用session_status() 会更干净:

if (session_status() == PHP_SESSION_ACTIVE) 
  echo 'Session is active';

PHP_SESSION_DISABLED 如果会话被禁用。 PHP_SESSION_NONE 如果会话已启用,但不存在。 PHP_SESSION_ACTIVE 如果会话已启用并且存在一个。

【讨论】:

为什么使用比较运算符 == 而不是标识运算符 === ?两者都返回整数... @micaball == 运算符的意思是“同等价值”。 === 运算符的意思是“具有相同的价值和类型”。我们只是在这个比较中寻找真/假值,所以== 是更好的选择。 @micaball (Too) 许多 php 函数可以返回混合的值类型(经典是 strpos())。在这种情况下,检查值类型实际上是有意义的。 session_status() 总是返回一个int,所以没有必要。 :) session_status() 返回状态的数值,所以这需要我调整一下 session_status() == 3【参考方案6】:

根据PHP.net manual:

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

【讨论】:

我认为这会帮助其他偶然发现这个答案的人:php.net/manual/en/function.isset.php

以上是关于检测 PHP 会话是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

php,如何检测会话ID是死的还是活的? [复制]

在php中检测一个变量是不是设置需要使用啥函数

检测会话当前是不是处于活动状态并加入而不是开始新的会话

php基础:变量检测

检测是不是存在某些东西,然后自动化过程

如何在请求会话之前检测用户是不是有 iOS 集成 Facebook 帐户设置?