检查PHP会话是否已经启动

Log*_*gan 439 php session session-variables

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

if(!isset($_COOKIE["PHPSESSID"]))
{
  session_start();
}
Run Code Online (Sandbox Code Playgroud)

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

注意:未定义的变量:_SESSION

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

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

lov*_*mos 728

推荐的PHP版本> = 5.4.0,PHP 7

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}
Run Code Online (Sandbox Code Playgroud)

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

对于PHP <5.4.0的版本

if(session_id() == '') {
    session_start();
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 161

对于PHP 5.4.0之前的PHP版本:

if(session_id() == '') {
    // session isn't started
}
Run Code Online (Sandbox Code Playgroud)

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

也就是说,我的观点是主观的,并且有些情况(下面的评论中描述了这些情况)可能无法知道会话是否已经启动.

  • 不知道你的会话是否已经启动并不一定是坏事.如果你是懒惰加载(只在第一次需要时启动会话),那么你的答案中的测试将非常好. (36认同)
  • 关于重构会话管理的评论,如果你不知道它是否是不合适的并不是真的相关.例如,如果将高级功能编码到WordPress主题中,您将无法知道插件是否已经开始使用会话而不进行检查.编码世界并不总是那么黑白:P (3认同)

Ben*_*min 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
Run Code Online (Sandbox Code Playgroud)

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

session_status() == PHP_SESSION_ACTIVE
Run Code Online (Sandbox Code Playgroud)

  • 一段代码,在可用时使用session_status,而旧的方法在不合适的时候似乎是完美的BTW,提示提示:) (3认同)

miy*_*uru 35

你可以做到这一点,这真的很容易.

if (!isset($_SESSION)) session_start();
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)

  • @zloctb:我想不出任何我会做`$ _SESSION = array();`的情况,所以这个答案似乎没问题. (6认同)
  • @halfer见Ryan的回答.如果调用`session_destroy()`那么仍然可以设置`$ _SESSION`.此外,在单元测试中,您可以直接设置`$ _SESSION`.但我支持这一点,因为在大多数实际情况下,这个答案应该足够好(直到PHP 5.3再也见不到......) (5认同)

Rya*_*efi 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.
Run Code Online (Sandbox Code Playgroud)

要么:

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.
Run Code Online (Sandbox Code Playgroud)

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


小智 21

if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }
Run Code Online (Sandbox Code Playgroud)


小智 12

对于所有的PHP版本

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}
Run Code Online (Sandbox Code Playgroud)


Els*_*han 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();
?>
Run Code Online (Sandbox Code Playgroud)

来源http://php.net


Wes*_*orp 6

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

if (strlen(session_id()) < 1) {
    session_start();
}
Run Code Online (Sandbox Code Playgroud)


小智 5

您唯一需要做的就是:

<?php
if(!isset($_SESSION))
{
session_start();
}
?>
Run Code Online (Sandbox Code Playgroud)


Mah*_*iya 5

if (session_id() === "") { session_start(); }
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 !


Dus*_*ant 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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)