Bereits gestartete PHP-Sitzungen


80

Wenn in meinem PHP-Code bereits eine Sitzung gestartet wurde und ich versuche, eine neue zu starten, wird folgende Meldung angezeigt:

Hinweis: Eine Sitzung wurde bereits gestartet. Session_start () wird ignoriert.

Wie kann ich das vermeiden?


3
Starten Sie keine neue Sitzung, wenn eine alte ausgeführt wird?
Madaras Geist

Mögliches Duplikat von Wie kann man feststellen, ob eine Sitzung aktiv ist? - Bitte benutzen Sie die Suche, bevor Sie eine Frage stellen.
hakre

Für mich funktionierte es einfach durch Entfernen von session_start (). Wenn die Sitzung bereits gestartet ist, warum müssen wir sie dann erneut starten. In meinem Fall war es nur eine config.php-Datei, die im Code enthalten war
Mangesh Sathe

Ich habe session_start()in eines meiner Includes und require_oncees in jede Datei eingefügt, die ich brauche.
Nurchi

Antworten:


244

Versuchen

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

Dies erleichtert die Implementierung der Sicherheit, wenn Sie eine Masterseite verwenden, um alle Ihre Inhalte zu verpacken.
Raymond Wachaga

Dies wird auch für die Zeiten empfohlen, in denen Sie möglicherweise die Datei mit session_start () laden oder nicht, also gute Standardpraxis
Steve Whitby

29

Wenn Sie ein neues möchten, tun session_destroy()Sie dies, bevor Sie es starten. Um zu überprüfen, ob es eingestellt ist, bevor Sie es starten, rufen Sie an 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();
}

Ich möchte vermeiden , die globale Überprüfung $_SESSIONstatt der ich das nenne session_status()Methode , da PHP diese Funktion explizit implementiert:

Sitzungsstatus über die neue Funktion session_status verfügbar machen Dies ist für (PHP> = 5.4.0)


5

Nur wenn Sie die vorherige Sitzung zerstören möchten:

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

oder du kannst verwenden

unset($_SESSION['variable_session _data'])

um eine bestimmte Sitzungsvariable zu zerstören.


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

Geschlossenes Spiel


2

Ja, Sie können durch Überprüfen feststellen, ob die Sitzung bereits ausgeführt wird isset($_SESSION). Die beste Antwort ist jedoch, nicht session_start()mehr als einmal anzurufen .

Es sollte sehr früh in Ihrem Skript aufgerufen werden, möglicherweise sogar in der ersten Zeile, und dann nicht erneut aufgerufen werden.

Wenn Sie es an mehr als einer Stelle in Ihrem Code haben, fragen Sie nach dieser Art von Fehler. Schneiden Sie es so ab, dass es nur an einer Stelle ist und nur einmal aufgerufen werden kann.


1

Sie müssen den Sitzungsstart bereits aufgerufen haben, vielleicht wird er über ein Include erneut aufgerufen?

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

1
Ein bisschen spät, aber aus irgendeinem Grund funktioniert das nicht. Nur (! Isset ($ _ SESSION)) funktioniert.
Mave

2
Brandgefahr : Notice: Undefined variable: _SESSION. Verwenden Sie issetstattdessen.
T30

1

Ich bin auf dieses Problem gestoßen, als ich versucht habe, das Blockierungsverhalten von $ _SESSION zu beheben.

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

Die Sitzungsdatei bleibt gesperrt, bis das Skript abgeschlossen oder die Sitzung manuell geschlossen wird.

Daher sollte eine Seite standardmäßig eine Sitzung im schreibgeschützten Modus öffnen. Sobald es jedoch schreibgeschützt geöffnet ist, muss es geschlossen und erneut geöffnet werden, um es in den Schreibmodus zu versetzen.

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

Wenn Sie dann gehen, um einen Wert zu schreiben:

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

Die Funktion benötigt ein Array von Schlüssel => Wertepaaren, um sie noch effizienter zu machen.


0

Versuche dies

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

Ich schlage vor, ob_start () zu verwenden; Bevor Sie eine Sesson Varriable starten, sollten Sie Ihren Browser-Puffer bestellen.

edit: Nach $ _SESSION wurde ein Extra hinzugefügt


0

Keine der oben genannten Optionen war geeignet, ohne session_start () in allen PHP-Dateien aufzurufen, die von $ Session-Variablen abhängen. Sie werden nicht enthalten sein. Der Hinweis ist so nervig und füllt das Error_log schnell aus. Die einzige Lösung, die ich finden kann, die funktioniert, ist diese ....

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

Eine schlechte Lösung, aber es funktioniert.


0

Es wäre effizienter:

@session_start();

Fehlerbehandlung auf dem Bildschirm vermeiden

Beste,


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

Grundsätzlich müssen Sie überprüfen, ob eine Sitzung gestartet wurde, bevor Sie eine andere erstellen. ... mehr lesen .

Auf der anderen Seite haben Sie eine vorhandene Sitzung zerstört, bevor Sie eine andere mit erstellt haben session_destroy().


0

Verwenden Sie einfach die if-Anweisung

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

oder

Überprüfen Sie den Sitzungsstatus mit session_status, der den aktuellen Sitzungsstatus zurückgibt. Wenn die aktuelle Sitzung bereits funktioniert, kehren Sie mit nichts anderem zurück, wenn die Sitzung nicht funktioniert. Starten Sie die Sitzung


session_status() === PHP_SESSION_ACTIVE ?: session_start();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.