会话_id()和会话_start()的PHP逻辑

会话_id()和会话_start()的PHP逻辑,php,session,Php,Session,我继承了以下有趣的代码。这种逻辑要么是多余的,要么是完全错误的 // make the use of sessions possible. if (!session_id()) { session_start(); } 然而,这是一个大规模的用户系统,我不愿意改变它。尽管我对PHP很有经验,但我还是很感激社区的意见,以确保我没有遗漏什么 如果您能提到副作用或深入了解当前代码,则可获得额外积分 更新 也许逻辑不是正确的词。调用会话启动()之前为什么要检查会话启动id(),因为它总是返回空

我继承了以下有趣的代码。这种逻辑要么是多余的,要么是完全错误的

// make the use of sessions possible.
if (!session_id()) {
    session_start();
}
然而,这是一个大规模的用户系统,我不愿意改变它。尽管我对PHP很有经验,但我还是很感激社区的意见,以确保我没有遗漏什么

如果您能提到副作用或深入了解当前代码,则可获得额外积分

更新
也许逻辑不是正确的词。调用
会话启动()
之前为什么要检查
会话启动id()
,因为它总是返回空字符串,因为代码中没有其他地方调用了
会话启动()

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

特别是在旧代码中,include文件用作函数(我见过这些函数)或类似的解决方案,一段代码可以做一些不同的事情:初始化新会话或设置新值

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

这当然意味着程序员知道她在做什么。大多数情况下,这种解决方案都是由于程序员只是从旧的代码库中复制代码,或者更可能是从现在的谷歌中复制代码,并对其进行调整,直到它不会崩溃,然后让它来完成这项工作


注释(在示例中)意味着会话支持不是强制的;仅当存在会话支持时,它们才会被实例化。PHP可以在没有会话支持IIRC的情况下编译。在这种情况下,这可能是程序员的错误,或者如果会话支持不存在,函数将始终返回false或null或其他内容

查看PHP.net:

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

如果要在不做太多更改的情况下更新代码,最好编写:

if (session_id() === "") {
   session_start();
}
检查会话是否已真正启动。如果对php.net文档进行注释和引用,则可以更清楚地看到开发人员试图实现的目标

请注意,尽管:

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

不太清楚。

我不敢回答,因为我正要问完全相同的问题,因为上面提到的代码片段最初对我来说也没有意义。所以我想知道为什么php.net网站上到处都能找到这些代码,并给出了一个初步的答案

  • 以前。。。我认为/希望的
    session\u id()
    是如何工作的
session\u id()
如果存在会话,则返回会话id。因此,如果我在我的站点上进行了身份验证,并且创建了一个会话并填充了数据,那么cookie已经创建并发送到浏览器

session_start();
$_SESSION['uid'] = 'root';
我在浏览器中打开的下一个页面应该让PHP看到我10秒前从cookie值(和内部文件)打开的会话,对吗?因此,在任何
会话\u start()之前运行此代码

会显示“是”吗

  • 不,不是那样的
要检查会话是否存在,必须在
session\u id()之前调用
session\u start()
。但是,等等。。。如果会话以前不存在(或已过期)
session\u start()
将创建会话。因此,在
session\u start()
之后调用
session\u id()
不太可能返回无效的结果,如果要检查会话是否存在,也没有多大意义。是吗

  • 事实上,这是有道理的。这取决于你的编程习惯
它有点像
require
require\u once
。。。我的PHP程序中没有任何
require\u once
。因为我只在必要的时候做requires,如果有一个致命的错误告诉我require做了两次,我会非常高兴:这意味着一个bug


会话也是一样:我在开始时调用一次
session\u start()
,或者根本不调用,这取决于上下文,因此不能调用两次(或者致命错误)。但是我想有些人需要
session\u id()
来告诉他们在同一请求中是否已经调用了
session\u start()
。这就是
session\u id()
有意义的地方…

我总是使用
if(empty($\u session))session\u start()也有同样的效果,不过我不确定这是好事还是坏事。如果开始执行大量包含,可能会混淆用户会话是否已初始化,以便快速检查验证是否已完成。如果会话已初始化,但其中未存储变量,
empty($\u session)
仍将返回TRUE.Doh。完全有道理。感谢您的回答。我只是想知道您是否最终删除了该(无用的)代码(因为您的
会话只在代码中启动了一次)
$sid = session_id();
if ($sid) {
   echo "Yes: no need to call session_start since ID is " . $sid;
   exit;
}