检查PHP会话是否已经启动

时间:2011-06-06 09:00:51

标签: php session session-variables

我有一个PHP文件,有时从已启动会话的页面调用,有时从没有启动会话的页面调用。因此,当我在此脚本上有session_start()时,我有时会收到“会话已启动”的错误消息。为此,我把这些行:

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

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

  

注意:未定义的变量:_SESSION

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

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

25 个答案:

答案 0 :(得分:692)

PHP> = 5.4.0,PHP 7

版本的推荐方式
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

参考:http://www.php.net/manual/en/function.session-status.php

对于 PHP<的版本5.4.0

if(session_id() == '') {
    session_start();
}

答案 1 :(得分:161)

对于PHP 5.4.0之前的PHP版本:

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

虽然,恕我直言,如果您不知道会话是否已经启动,您应该考虑重构会话管理代码......

尽管如此,我的观点是主观的,有些情况(下面的评论中描述了这些例子),可能无法知道会话是否已经开始。

答案 2 :(得分:70)

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

答案 3 :(得分:35)

你可以做到这一点,而且非常简单。

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

希望有所帮助:)

答案 4 :(得分:21)

在PHP 5.4之前,除了设置全局标志之外,没有可靠的了解方法。

考虑:

var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.

或者:

session_id(); // returns empty string
session_start();
session_id(); // returns session hash
session_destroy();
session_id(); // returns empty string, ok, but then
session_id('foo'); // tell php the session id to use
session_id(); // returns 'foo', but no session is active.

因此,在PHP 5.4之前,您应该设置一个全局布尔值。

答案 5 :(得分:21)

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

答案 6 :(得分:10)

适用于所有php版本

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}

答案 7 :(得分:9)

检查一下:

<?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

答案 8 :(得分:6)

使用session_id(),如果未设置,则返回空字符串。它比检查$_COOKIE

更可靠
if (strlen(session_id()) < 1) {
    session_start();
}

答案 9 :(得分:5)

if (session_id() === "") { session_start(); }
希望它有所帮助!

答案 10 :(得分:5)

这适用于所有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();
    }
  }
}

答案 11 :(得分:4)

您唯一需要做的是:

<?php
if(!isset($_SESSION))
{
session_start();
}
?>

答案 12 :(得分:2)

不确定此类解决方案的效率,但这是来自工作项目 如果您需要定义默认语言

,也会使用此选项
   /**
    * Start session
    * Fall back to ukrainian language
    */
   function valid_session() {
    if(session_id()=='') {
        session_start();
        $_SESSION['lang']='uk';
        $_SESSION['lang_id']=3;
    }
    return true;
  }

答案 13 :(得分:1)

基于@Meliza Ramos响应的响应(请参阅第一个回复)和http://php.net/manual/en/function.phpversion.php

行动:

  • 定义PHP_VERSION_ID(如果不存在)
  • 定义基于PHP_VERSION_ID
  • 检查版本的函数
  • 将函数定义为openSession()secure

仅使用 openSession()

->

答案 14 :(得分:1)

您应该重新组织代码,以便每次执行时只调用一次session_start()

答案 15 :(得分:1)

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文件,您可以通过选择菜肴并删除/添加或更改订单来为餐厅配置菜单。 我工作的服务器没有实际版本,所以我更灵活。这取决于作者希望使用并试用它。

答案 16 :(得分:1)

此代码段是否适合您?

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

答案 17 :(得分:1)

在PHP 5.3上,这对我有用:

if(!strlen(session_id())){
    session_name('someSpecialName');
    session_start();
} 
那你有。如果你没有把not at语句开头,会话将以任何方式开始,我不知道为什么。

答案 18 :(得分:0)

从PHP 5.2.7起可以使用

PHP_VERSION_ID,因此请先检查并在必要时创建它。 从PHP 5.4开始提供session_status,因此我们也必须检查:

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();
    }
}

答案 19 :(得分:0)

android:layout_width="wrap_content"

答案 20 :(得分:0)

这是我用来确定会话是否已启动的内容。通过使用empty和isset如下:

if (empty($_SESSION)  && !isset($_SESSION))  {
    session_start();
}

答案 21 :(得分:0)

根据我的惯例,在访问$_SESSION[]之前,您需要每次都使用脚本调用session_start。请参阅以下链接以获取手册。

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

对我来说,至少session_start令人困惑的是一个名字。 session_load可以更明确。

答案 22 :(得分:0)

我最终仔细检查了状态。 PHP 5.4 +

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

答案 23 :(得分:0)

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

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

答案 24 :(得分:-2)

session_start();替换为:

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