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

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

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

注意:未定义变量:_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.

Or:

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

其他回答

在函数调用之前@会抑制函数调用过程中可能报告的任何错误。

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

例如:

在你已经打印了一些东西到浏览器之后使用session_start()会导致一个错误,所以PHP会显示类似“头不能被发送:started at (line 12)”这样的东西,@session_start()在这种情况下仍然会失败,但错误消息不会打印在屏幕上。

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

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


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

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

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

你唯一需要做的就是:

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

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

if (strlen(session_id()) < 1) {
    session_start();
}

在PHP 5.3这为我工作:

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

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