检测 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 会话是不是存在的主要内容,如果未能解决你的问题,请参考以下文章