已经开始的PHP会话


81

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

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

如何避免这种情况?


3
如果正在运行旧会话,则不开始新会话吗?
马达拉的幽灵2012年

如何判断会话是否处于活动状态的可能重复项-请在提出问题之前使用搜索。
哈克(Hakre)2012年

对我来说,它只是通过删除session_start()来工作,如果会话已经开始,那么为什么我们需要再次启动它。在我的情况下,这只是一个config.php文件,其中包含代码
Mangesh Sathe

我已将session_start()其中一个包含require_once在我需要的每个文件中。
nurchi

Answers:



29

如果您想要一个新的,则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)


5

仅当您想破坏上一个会话时:

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

或者你可以使用

unset($_SESSION['variable_session _data'])

销毁特定的会话变量。


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

封闭游戏


2

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

应该在脚本的最早期就调用它,甚至可能在第一行中也要调用它,然后就不要再调用它了。

如果您在代码中的多个位置中都存在该错误,那么您将要求获得这种错误。削减它,使其仅在一个地方,只能被调用一次。


1

您是否必须已经调用会话开始,也许通过包含再次调用?

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

1
有点晚了,但是无论出于什么原因,这都不起作用。仅(!isset($ _ SESSION))有效。
Mave

2
风险触发此:Notice: Undefined variable: _SESSION。使用isset代替。
T30

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对的数组来提高效率。


0

试试这个

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

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

编辑:在$ _SESSION之后增加了一个)


0

以上所有都不适合,如果在所有不依赖$ Session变量的php文件中调用session_start(),它们将不包含在内。该通知太烦人了,并迅速填写Error_log。我能找到的唯一可行的解​​决方案是...

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

错误的修复程序,但它可以工作。


0

这样会更有效:

@session_start();

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

最好,


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

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

另一方面,您选择了销毁现有会话,然后使用创建另一个会话session_destroy()


0

只需使用if语句

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

要么

使用session_status检查会话状态,该会话返回当前会话状态,如果当前会话已经在工作,则如果会话不工作则返回其他内容,否则将启动会话


session_status() === PHP_SESSION_ACTIVE ?: session_start();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.