检查PHP会话是否已经启动

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

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

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

注意:未定义变量:_SESSION

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

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

531991 次浏览

对于PHP 5.4.0之前的版本:

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

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

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

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

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

if (strlen(session_id()) < 1) {
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

不确定这样的解决方案的效率,但这是从工作项目 如果需要定义默认语言

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

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

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

在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之前,您应该设置一个全局布尔值。

PHP >= 5.4.0, PHP 7, PHP 8版本的推荐方法

if (session_status() === PHP_SESSION_NONE) {
session_start();
}

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

对于PHP & lt;5.4.0的版本

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

在PHP 5.3这为我工作:

if(!strlen(session_id())){
session_name('someSpecialName');
session_start();
}

然后你有。如果你不把不放在If语句开始会话将以任何方式开始我不知道为什么。

你唯一需要做的就是:

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

适用于所有php版本

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

希望能有所帮助!

这应该适用于所有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

if (version_compare(phpversion(), '5.4.0', '<')) {
if(session_id() == '') {
session_start();
}
}
else
{
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
}
session_start();
if(!empty($_SESSION['user']))
{
//code;
}
else
{
header("location:index.php");
}

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

根据@Meliza Ramos的响应(见第一个响应)和http://php.net/manual/en/function.phpversion.php

行动:

  • 如果不存在,定义PHP_VERSION_ID
  • 根据PHP_VERSION_ID定义函数检查版本
  • 定义函数为openSession()安全

只使用openSession ()

    // PHP_VERSION_ID is available as of PHP 5.2.7, if our
// version is lower than that, then emulate it
if (!defined('PHP_VERSION_ID')) {
$version = explode('.', PHP_VERSION);


define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));




// PHP_VERSION_ID is defined as a number, where the higher the number
// is, the newer a PHP version is used. It's defined as used in the above
// expression:
//
// $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
//
// Now with PHP_VERSION_ID we can check for features this PHP version
// may have, this doesn't require to use version_compare() everytime
// you check if the current PHP version may not support a feature.
//
// For example, we may here define the PHP_VERSION_* constants thats
// not available in versions prior to 5.2.7


if (PHP_VERSION_ID < 50207) {
define('PHP_MAJOR_VERSION',   $version[0]);
define('PHP_MINOR_VERSION',   $version[1]);
define('PHP_RELEASE_VERSION', $version[2]);


// and so on, ...
}
}


function phpVersionAtLeast($strVersion = '0.0.0')
{
$version = explode('.', $strVersion);


$questionVer = $version[0] * 10000 + $version[1] * 100 + $version[2];


if(PHP_VERSION_ID >= $questionVer)
return true;
else
return false;


}


function openSession()
{
if(phpVersionAtLeast('5.4.0'))
{
if(session_status()==PHP_SESSION_NONE)
session_start();
}
else // under 5.4.0
{
if(session_id() == '')
session_start();
}
}
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文件,您可以通过选择一道菜并删除/添加或更改订单来配置餐厅的菜单。 我工作的服务器没有实际的版本,所以我让它更灵活。这取决于作者是否愿意使用和尝试。

session_start();替换为:

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

这个代码片段适合您吗?

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

这就是我用来确定会话是否已经开始的方法。使用empty和isset如下所示:

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

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

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

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

最后我对状态进行了两次检查。php 5.4 +

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

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

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

@在函数调用之前抑制在函数调用期间可能报告的任何错误。

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

例如:

在你已经将一些内容打印到浏览器后使用session_start()会导致一个错误,因此PHP将显示类似“头文件不能发送:从(第12行)开始”的内容,在这种情况下@session_start()仍然会失败,但错误消息不会打印在屏幕上。

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

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


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