我有一个PHP文件,有时从一个已经开始会话的页面调用,有时从一个没有会话启动的页面调用。因此,当我在这个脚本上有session_start()时,我有时会得到“会话已经开始”的错误消息。为此,我写了以下几行:

if(!isset($_COOKIE["PHPSESSID"]))
{
  session_start();
}

但这次我收到了警告信息:

注意:未定义变量:_SESSION

是否有更好的方法来检查会话是否已经开始?

如果我使用@session_start,它会使事情正常工作,只是关闭警告?


当前回答

最后我对状态进行了两次检查。php 5.4 +

if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};

其他回答

对于PHP 5.4.0之前的版本:

if(session_id() == '') {
    // session isn't started
}

不过,恕我直言,如果你不知道会话是否已经启动,你真的应该考虑重构会话管理代码……

也就是说,我的观点是主观的,在某些情况下(下面的评论中描述了其中的例子),可能无法知道会话是否已经启动。

if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }

根据我的实践,在访问$_SESSION[]之前,您需要每次调用session_start来使用脚本。请参阅下面的手册链接。

http://php.net/manual/en/function.session-start.php

至少对我来说,session_start这个名字让人很困惑。session_load可以更清楚。

取代session_start ();:

if (!isset($a)) {
    a = False;
    if ($a == TRUE) {
        session_start();
        $a = TRUE;
    }
}

您可以使用以下解决方案来检查PHP会话是否已经启动:

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}