【问题标题】: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'])

标签: php session


【解决方案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 中注册的变量。

        【讨论】:

        猜你喜欢
        • 2012-10-03
        • 2012-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 2018-04-04
        • 2013-02-26
        • 2013-05-22
        • 2017-05-01
        相关资源
        最近更新 更多