89

在我的 PHP 代码中,如果一个会话已经开始,并且我尝试开始一个新的会话,我会收到以下通知:

注意:会话已经开始 - 忽略 session_start()

我怎样才能避免这种情况?

4

12 回答 12

282

尝试

<?php
    if(!isset($_SESSION)) 
    { 
        session_start(); 
    } 
?>
于 2012-05-18T08:09:20.783 回答
34

如果你想要一个新的,那么session_destroy()在开始之前做。要在启动之前检查它是否设置,请调用session_status()

$status = session_status();
if($status == PHP_SESSION_NONE){
    //There is no active session
    session_start();
}else
if($status == PHP_SESSION_DISABLED){
    //Sessions are not available
}else
if($status == PHP_SESSION_ACTIVE){
    //Destroy current and start new one
    session_destroy();
    session_start();
}

我会避免检查全局$_SESSION而不是调用session_status()方法,因为 PHP 将此函数显式实现为:

通过新函数 session_status 公开会话状态 这是针对 (PHP >=5.4.0)

于 2012-05-18T08:09:54.627 回答
5

仅当您想销毁以前的会话时:

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

或者你可以使用

unset($_SESSION['variable_session _data'])

销毁特定的会话变量。

于 2012-05-18T08:52:23.313 回答
4
session_status() === PHP_SESSION_ACTIVE ?: session_start();

封闭游戏

于 2019-10-02T18:27:57.267 回答
2

是的,您可以通过检查来检测会话是否已经在运行isset($_SESSION)。然而,最好的答案就是不要session_start()多次打电话。

它应该在你的脚本中很早就被调用,甚至可能是第一行,然后不再调用。

如果您在代码中的多个位置有它,那么您要求获得这种错误。把它剪下来,让它只在一个地方,并且只能被调用一次。

于 2012-05-18T23:32:36.640 回答
1

您必须已经调用了会话开始,可能会通过包含再次调用?

if( ! $_SESSION)
{
    session_start();
}  
于 2012-05-18T08:09:54.323 回答
1

我在尝试修复 $_SESSION 的阻塞行为时遇到了这个问题。

http://konrness.com/php5/how-to-prevent-blocking-php-requests/

会话文件保持锁定状态,直到脚本完成或手动关闭会话。

因此,默认情况下,页面应该以只读模式打开会话。但是一旦它以只读方式打开,就必须关闭并重新打开才能使其进入写入模式。

const SESSION_DEFAULT_COOKIE_LIFETIME = 86400;

/**
 * Open _SESSION read-only
 */
function OpenSessionReadOnly() {
    session_start([
                      'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME,
                      'read_and_close'  => true,    // READ ACCESS FAST
                  ]);
    // $_SESSION is now defined. Call WriteSessionValues() to write out values
}

/**
 * _SESSION is read-only by default. Call this function to save a new value
 * call this function like `WriteSessionValues(["username"=>$login_user]);`
 * to set $_SESSION["username"]
 *
 * @param array $values_assoc_array
 */
function WriteSessionValues($values_assoc_array) {
    // this is required to close the read-only session and 
    // not get a warning on the next line.
    session_abort();

    // now open the session with write access
    session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME ]);

    foreach ($values_assoc_array as $key => $value) {
        $_SESSION[ $key ] = $value;
    }
    session_write_close();  // Write session data and end session

    OpenSessionReadOnly(); // now reopen the session in read-only mode.
}

OpenSessionReadOnly();  // start the session for this page

然后当你去写一些值时:

WriteSessionValues(["username"=>$login_user]);

该函数采用一个 key=>value 对数组,以使其更加高效。

于 2017-07-07T04:40:02.323 回答
1

只需使用 if 语句

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

或者

使用返回当前会话状态的 session_status 检查会话状态,如果当前会话已经在工作,则如果会话不工作,则不返回任何内容启动会话


session_status() === PHP_SESSION_ACTIVE ?: session_start();
于 2020-08-17T14:45:22.953 回答
0
<?php
if ( session_id() != "" ) {
    session_start();
}

基本上,您需要在创建另一个会话之前检查一个会话是否已启动;...更多阅读

另一方面,您选择在使用session_destroy().

于 2012-05-18T08:12:39.970 回答
0

试试这个

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

我建议你使用 ob_start(); 在开始任何 sesson 变量之前,这应该命令您浏览器缓冲区。

编辑:在 $_SESSION 之后添加了一个额外的 )

于 2014-09-25T09:10:03.170 回答
0

以上都不适合,如果没有在所有依赖于 $Session 变量的 php 文件中调用 session_start() ,它们将不会被包含在内。通知太烦人了,很快就填满了Error_log。我能找到的唯一可行的解​​决方案是这个......

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

一个不好的修复,但它的工作原理。

于 2017-06-16T08:37:04.623 回答
0

它会更有效:

@session_start();

避免屏幕中的错误处理程序

最好的,

于 2017-08-23T22:48:47.510 回答