session_id()和session_start()的PHP逻辑

时间:2011-07-28 21:29:13

标签: php session

我继承了以下有趣的代码。这个逻辑似乎是多余的,也可能是错误的。

// make the use of sessions possible.
if (!session_id()) {
    session_start();
}

然而,它是在大规模用户系统上,我不愿意改变它。尽管有PHP经验,但我很感激社区的投入,以确保我不会错过任何东西。

如果您可以提及当前代码的副作用或洞察力,则获得积分。

更新

也许逻辑不是正确的词。为什么在调用session_id()之前检查session_start(),当它始终返回空字符串时,否则代码中的其他位置将被session_start()调用。

4 个答案:

答案 0 :(得分:13)

需要此代码来检查会话是否已启动。如果会话已启动,则无需再次初始化它。此外,尝试在会话已初始化时调用session_start()将导致E_NOTICE错误。

答案 1 :(得分:4)

看看PHP.net:
http://php.net/manual/en/function.session-id.php

  

session_id()返回当前会话的会话ID或空字符串(“”),如果没有当前会话(不存在当前会话ID)。

如果您要更新代码而不做太多改动,最好写一下:

if (session_id() === "") {
   session_start();
}

检查会话是否真的开始。如果对php.net doc进行评论和引用,那么看看开发人员想要完成的工作会更清楚。

请注意,同时:

$test = ""
!$test // This returns true    

不太清楚。

答案 2 :(得分:1)

特别是在旧代码中,包含文件作为函数(我已经看过那些)或类似的解决方案,单个代码可以做几件不同的事情:初始化新会话或设置新值。

该代码可用于检查会话是否已启动。在它可能是例如会话数据验证之后,或者与会话完全无关的东西,但是需要存在会话的东西。

这当然意味着程序员知道她在做什么。大多数时候,这种解决方案只是程序员只是从旧的代码库中复制代码,或者现在更有可能从Google复制代码,并调整它直到它不会崩溃,并让它来完成这项工作。

评论(在示例中)意味着不强制会话支持;只有存在会话支持时,它们才会立即生效。 PHP可以在没有会话支持IIRC的情况下编译。在这种情况下,要么是程序员错误,要么函数总是返回false或null,如果不存在会话支持,则返回false。

答案 3 :(得分:0)

我敢回答,因为我正在问同样的问题,因为上面提到的代码片段最初对我来说没有意义(或者)。所以我想知道为什么在php.net网站上随处可见代码,并提出了一个初步的答案。

  • 之前...我的想法/希望session_id()正在发挥作用
如果会话存在,

session_id()将返回会话ID。因此,如果我在我的网站上进行了身份验证并且已创建会话并填充了数据,则已创建cookie并将其发送到浏览器

session_start();
$_SESSION['uid'] = 'root';

我在浏览器中打开的下一页应该让PHP看到我从cookie值(和内部文件)提前10秒打开的会话,对吧?因此,在任何session_start()

之前运行此代码
$sid = session_id();
if ($sid) {
   echo "Yes: no need to call session_start since ID is " . $sid;
   exit;
}

会显示是吗?

  • nope它不能那样工作。

要检查会话是否存在,必须在session_start()之前致电session_id()。但是,等等......如果以前不存在会话(或已过期),session_start() 会创建会话。因此,在session_id()之后调用session_start()不太可能返回无效结果,并且如果想要检查会话是否存在则没有多大意义。是吗?

  • 实际上它确实/可能有意义。取决于您的编程习惯。

有点像requirerequire_once ...我的PHP程序中没有任何require_once。因为我只在必要时执行需要,并且非常乐意让致命错误告诉我 require 已完成两次:意味着一个错误。

与会话相同:我根据上下文在开始时调用session_start()一次或根本不调用session_id(),因此不能调用两次(或致命错误)。但我想有些人需要session_start()告诉他们之前是否已在同一请求中调用session_id() 。这是{{1}}有意义的地方......