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

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

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

注意:未定义变量:_SESSION

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

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


当前回答

这个代码片段适合您吗?

if (!count($_SESSION)>0) {
    session_start();
}

其他回答

使用session_id(),如果没有设置,它将返回一个空字符串。它比检查$_COOKIE更可靠。

if (strlen(session_id()) < 1) {
    session_start();
}

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

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

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

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

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

你可以这样做,而且非常简单。

if (!isset($_SESSION)) session_start();

在函数调用之前@会抑制函数调用过程中可能报告的任何错误。

在session_start之前添加@告诉PHP避免打印错误消息。

例如:

在你已经打印了一些东西到浏览器之后使用session_start()会导致一个错误,所以PHP会显示类似“头不能被发送:started at (line 12)”这样的东西,@session_start()在这种情况下仍然会失败,但错误消息不会打印在屏幕上。

在包含文件或重定向到新页面之前,请使用exit()函数,否则将报错。

此代码可以在所有情况下使用:


    <?php 
        if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
            session_start(); 
        }
    ?>