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?

user1400702
quelle
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(); 
    } 
?>
Valeriy Gorbatikov
quelle
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)

Juan Cortés
quelle
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.

Code Spy
quelle
3
session_status() === PHP_SESSION_ACTIVE ?: session_start();

Geschlossenes Spiel

Crabthug
quelle
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.

Spudley
quelle
1

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

if( ! $_SESSION)
{
    session_start();
}  
MikeCruz13
quelle
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.

TrophyGeek
quelle
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

user2521037
quelle
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.

Wayne Kirk
quelle
0

Es wäre effizienter:

@session_start();

Fehlerbehandlung auf dem Bildschirm vermeiden

Beste,

Jos3
quelle
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().

Odinn
quelle
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();
MD SHAYON
quelle