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

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

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

注意:未定义变量:_SESSION

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

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


当前回答

PHP_VERSION_ID从PHP 5.2.7开始可用,所以首先检查它,如果有必要,创建它。 session_status在PHP 5.4就可用了,所以我们也要检查这个:

if (!defined('PHP_VERSION_ID')) {
    $version = explode('.', PHP_VERSION);
    define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}else{
    $version = PHP_VERSION_ID;
}
if($version < 50400){
    if(session_id() == '') {
        session_start();
    }
}else{
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
}

其他回答

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

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

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

if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
    $sess = session_status();
    if ($sess == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if (!$_SESSION) {
        session_start();
    }
}

事实上,现在在这里解释已经太迟了,因为它已经被解决了。 这是我的一个项目的.inc文件,您可以通过选择一道菜并删除/添加或更改订单来配置餐厅的菜单。 我工作的服务器没有实际的版本,所以我让它更灵活。这取决于作者是否愿意使用和尝试。

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版本。它确定PHP版本,然后根据PHP版本检查会话是否启动。然后,如果会话未启动,则启动会话。

function start_session() {
  if(version_compare(phpversion(), "5.4.0") != -1){
    if (session_status() == PHP_SESSION_NONE) {
      session_start();
    }
  } else {
    if(session_id() == '') {
      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