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

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

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

注意:未定义变量:_SESSION

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

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


当前回答

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

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

其他回答

最简单的方法:

(session_status()==2)?:session_start();

看看这个:

<?php
/**
* @return bool
*/
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();
?>

源http://php.net

您应该重新组织代码,以便在每次页面执行时都调用session_start()一次。

PHP 5.4引入了session_status(),它比依赖session_id()更可靠。

考虑下面的代码片段:

session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false

因此,要检查会话是否已启动,PHP 5.4中推荐的方法是:

session_status() == PHP_SESSION_ACTIVE

对于PHP 5.4.0之前的版本:

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

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

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