已经启动的PHP会话

时间:2012-05-18 08:06:32

标签: php session

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

  

注意:会话已经启动 - 忽略session_start()

我该如何避免这种情况?

12 个答案:

答案 0 :(得分:208)

尝试

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

答案 1 :(得分:27)

如果您想要一个新的,请在启动之前执行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)

答案 2 :(得分:3)

仅当您要销毁以前的会话时

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

或者您可以使用

unset($_SESSION['variable_session _data'])

销毁特定的会话变量。

答案 3 :(得分:2)

是的,您可以通过选中isset($_SESSION)来检测会话是否已在运行。但最好的答案是不要多次拨打session_start()

应该在脚本中尽早调用它,甚至可能在第一行调用,然后不再调用。

如果您在代码中的多个位置拥有它,那么您就会要求获得此类错误。将其剪下来,只在一个地方,只能调用一次。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

<?php
if ( session_id() != "" ) {
    session_start();
}

基本上,您需要在创建会话之前检查会话是否已启动; ... more reading.

另一方面,您选择在使用session_destroy()创建另一个会话之前销毁现有会话。

答案 6 :(得分:0)

试试这个

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

我建议你使用ob_start();在启动任何sesson varriable之前,这应该命令你浏览器缓冲区。

编辑:在$ _SESSION

之后添加额外的内容

答案 7 :(得分:0)

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

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

错误修复,但它确实有效。

答案 8 :(得分:0)

我在尝试修复$ _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]);

答案 9 :(得分:0)

效率更高:

@session_start();

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

最佳,

答案 10 :(得分:0)

session_status() === PHP_SESSION_ACTIVE ?: session_start();

封闭游戏

答案 11 :(得分:0)

仅使用if语句

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

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


session_status() === PHP_SESSION_ACTIVE ?: session_start();