Überprüfen Sie, ob die PHP-Sitzung bereits gestartet wurde


461

Ich habe eine PHP-Datei, die manchmal von einer Seite aufgerufen wird, die eine Sitzung gestartet hat, und manchmal von einer Seite, auf der keine Sitzung gestartet wurde. Daher session_start()erhalte ich bei diesem Skript manchmal die Fehlermeldung "Sitzung bereits gestartet". Dafür habe ich folgende Zeilen gesetzt:

if(!isset($_COOKIE["PHPSESSID"]))
{
  session_start();
}

aber diesmal habe ich diese Warnmeldung bekommen:

Hinweis: Undefinierte Variable: _SESSION

Gibt es eine bessere Möglichkeit, um zu überprüfen, ob die Sitzung bereits gestartet wurde?

Wenn ich benutze @session_start, funktioniert es dann richtig und macht einfach die Warnungen aus?



Siehe auch diese Antworten von Stackoverflow: stackoverflow.com/questions/1545357/…
contact-form.co_you_go

Antworten:


761

Empfohlener Weg für Versionen von PHP> = 5.4.0, PHP 7

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

Referenz: http://www.php.net/manual/en/function.session-status.php

Für Versionen von PHP <5.4.0

if(session_id() == '') {
    session_start();
}

1
Ich denke, es gibt ein Problem mit der Lösung für PHP <5.4. session_id wird festgelegt, wenn die Sitzung zum ERSTEN Mal gestartet wird, sie wird jedoch nicht gelöscht, wenn die Sitzung geschlossen wird. Wenn es zum Beispiel vor Ihrem Snippet einen Code gibt wie session_start();session_write_close();: dann schlägt die if-Bedingung fehl, aber wir haben keine offene Sitzung ...
Nicolò Martini

@Nicolo Martini So wie ich es verstehe: Eine Sitzung, session_start()die oben in einem Skript gestartet wurde, wird geschlossen, wenn das Skript beendet wird, oder wenn sie session_write_closed()aufgerufen wird, bevor das Skript beendet wird. Das heißt, eine Sitzung wird geschlossen, wenn ihre Daten in das Sitzungscookie geschrieben werden und die Sitzung für den Zugriff durch ein anderes Skript entsperrt wird, das auch 'session_start' aufruft. SCHLIESSEN bedeutet daher NICHT, dass die Sitzung ZERSTÖRT ist. Sie können eine Sitzung schließen, indem Sie das aktuelle Skript beenden oder aufrufen session_write_close(), und Sie können sie erneut öffnen, indem Sie aufrufen session_start(). Zumindest mein Verständnis.
Stefan

1
Ist dies immer noch ein guter Weg, um eine Sitzung zu starten? Weil in dem Link nichts mit dieser Antwort zu
tun hat

@ csandreas1 Sie sehen unter dem Link die Beschreibung von session_status und die erwarteten Rückgabewerte. Die Antwort auf Ihre Frage lautet ja!
Lovelyramos

Ich hatte diesen Fehler unter bestimmten Umständen - ich habe if (! Isset ($ _ SESSION)) mit Erfolg verwendet
Scott

161

Für Versionen von PHP vor PHP 5.4.0:

if(session_id() == '') {
    // session isn't started
}

IMHO sollten Sie jedoch wirklich darüber nachdenken, Ihren Sitzungsverwaltungscode zu überarbeiten, wenn Sie nicht wissen, ob eine Sitzung gestartet wird oder nicht ...

Trotzdem ist meine Meinung subjektiv und es gibt Situationen (Beispiele dafür sind in den Kommentaren unten beschrieben), in denen es möglicherweise nicht möglich ist zu wissen, ob die Sitzung gestartet wird.


37
Es ist nicht unbedingt schlecht, nicht zu wissen, ob Ihre Sitzung gestartet wurde. Wenn Sie faul laden (die Sitzung nur dann starten, wenn sie zum ersten Mal benötigt wird), ist der Test in Ihrer Antwort vollkommen in Ordnung.
Drawm

1
Auch in einigen Umgebungen hat Apache Sitzungsautostart eingerichtet
LeonardChallis

Ein Beispiel zum Testen, ob session_id () eine leere Zeichenfolge in einer Include-Datei
zurückgibt

3
Der Kommentar zum Refactoring der Sitzungsverwaltung, wenn Sie nicht wissen, ob er gestartet wurde oder nicht, ist nicht wirklich relevant. Wenn Sie beispielsweise erweiterte Funktionen in ein WordPress-Theme codieren, werden Sie nie erfahren, ob ein Plugin bereits Sitzungen ohne Überprüfung verwendet hat. Die Codierungswelt ist nicht immer so schwarz und weiß: P
Jimbo Jonny

Mmm, gute Punkte in der Tat. Ich gebe zu, dass meine Kommentare sehr subjektiv sind - ich werde meine Antwort ändern, um dies widerzuspiegeln.
Alex

71

PHP 5.4 führte session_status () ein , was zuverlässiger ist, als sich darauf zu verlassen session_id().

Betrachten Sie das folgende Snippet:

session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false

Um zu überprüfen, ob eine Sitzung gestartet wurde, wird in PHP 5.4 jetzt empfohlen:

session_status() == PHP_SESSION_ACTIVE

3
Ein Codeausschnitt, der session_status verwendet, wenn verfügbar, und ältere Methoden, wenn nicht, scheinen hier übrigens perfekt zu sein, Hinweis Hinweis :)
Jimbo Jonny

1
Danke für das Update Benjamin. Es ist gut zu wissen, dass ab PHP 5.4 eine neue Methode verwendet werden kann.
Logan

1
Dies ist eine viel bessere Möglichkeit, dies zu überprüfen. Sie wissen nicht immer, ob Sie eine Sitzung gestartet haben, insbesondere wenn der Benutzer Cookies löscht, während er gerade auf der Website surft ... Ich codiere immer für 2-Jährige, Sie Ich weiß nie, was Benutzer tun werden es wird benötigt
Andy Braham

35

Sie können dies tun, und es ist wirklich einfach.

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

Ich hoffe es hilft :)


6
@zloctb: Ich kann mir keine Situation vorstellen, in der ich es tun würde $_SESSION=array();, also scheint diese Antwort in Ordnung zu sein.
Halfer

5
@halfer Siehe Ryans Antwort. Wenn session_destroy()aufgerufen wurde, $_SESSIONkonnte dann noch gesetzt werden. In Unit-Tests können Sie auch $_SESSIONdirekt einstellen . Aber ich habe dies positiv bewertet, da diese Antwort für die meisten praktischen Situationen gut genug sein sollte (bis PHP 5.3 nie mehr zu sehen ist ...)
Darren Cook

22
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }

21

Vor PHP 5.4 gibt es keine zuverlässige Möglichkeit, dies zu wissen, außer ein globales Flag zu setzen.

Erwägen:

var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.

Oder:

session_id(); // returns empty string
session_start();
session_id(); // returns session hash
session_destroy();
session_id(); // returns empty string, ok, but then
session_id('foo'); // tell php the session id to use
session_id(); // returns 'foo', but no session is active.

Vor PHP 5.4 sollten Sie also einen globalen Booleschen Wert festlegen.


12

Für alle PHP-Versionen

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}

1
Ebenso könnte man auch tunif ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
Anthony Hatzopoulos

9

Überprüfen Sie dies :

<?php
/**
* @return bool
*/
function is_session_started()
{
    if ( php_sapi_name() !== 'cli' ) {
        if ( version_compare(phpversion(), '5.4.0', '>=') ) {
            return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
        } else {
            return session_id() === '' ? FALSE : TRUE;
        }
    }
    return FALSE;
}

// Example
if ( is_session_started() === FALSE ) session_start();
?>

Quelle http://php.net


6

Verwenden Sie session_id () , es wird eine leere Zeichenfolge zurückgegeben, wenn sie nicht festgelegt ist. Es ist zuverlässiger als die Überprüfung der $_COOKIE.

if (strlen(session_id()) < 1) {
    session_start();
}


5

Dies sollte für alle PHP-Versionen funktionieren. Es bestimmt die PHP-Version und prüft dann, ob die Sitzung basierend auf der PHP-Version gestartet wird. Wenn die Sitzung dann nicht gestartet wird, wird sie gestartet.

function start_session() {
  if(version_compare(phpversion(), "5.4.0") != -1){
    if (session_status() == PHP_SESSION_NONE) {
      session_start();
    }
  } else {
    if(session_id() == '') {
      session_start();
    }
  }
}

4

Das einzige, was Sie tun müssen, ist:

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

Dies ist die, die ich im Laufe der Jahre verwendet habe. Jemand, der davon abrät, diesen zu verwenden? Natürlich ist es gut, zu überprüfen, ob die Sitzung manchmal gestartet wird - in einigen Umgebungen hat Apache einen automatischen Sitzungsstart eingerichtet, verzögert geladen (die Sitzung wird nur gestartet, wenn sie zum ersten Mal benötigt wird) oder einfach, dass manchmal nur ein schneller Hack ausgeführt werden muss
K. Kilian Lindberg

IST DIE GLEICHE ANTWORT OBEN (@miyuru)

2

Sie sind sich nicht sicher über die Effizienz einer solchen Lösung, aber dies stammt aus einem Arbeitsprojekt. Dies wird auch verwendet, wenn Sie die Standardsprache definieren müssen

   /**
    * Start session
    * Fall back to ukrainian language
    */
   function valid_session() {
    if(session_id()=='') {
        session_start();
        $_SESSION['lang']='uk';
        $_SESSION['lang_id']=3;
    }
    return true;
  }

2

@ vor einem Funktionsaufruf werden alle Fehler unterdrückt, die während des Funktionsaufrufs gemeldet werden.

@Vorher ein hinzufügensession_start wird PHP angewiesen, das Drucken von Fehlermeldungen zu vermeiden.

Zum Beispiel:

Die Verwendung, session_start()nachdem Sie bereits etwas im Browser gedruckt haben, führt zu einem Fehler, sodass PHP Folgendes anzeigt: "Header können nicht gesendet werden: gestartet um (Zeile 12)",@session_start() In diesem Fall schlägt dies immer noch fehl, aber die Fehlermeldung wird nicht gedruckt Bildschirm.

Bevor Sie die Dateien einfügen oder auf eine neue Seite umleiten, verwenden Sie die exit() Funktion, Andernfalls wird ein Fehler ausgegeben.

Dieser Code kann in allen Fällen verwendet werden:


    <?php 
        if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
            session_start(); 
        }
    ?>

1

Unter PHP 5.3 funktioniert das bei mir:

if(!strlen(session_id())){
    session_name('someSpecialName');
    session_start();
} 

dann hast du. Wenn Sie die nicht at if-Anweisung nicht setzen, beginnt die Sitzung auf irgendeine Weise. Ich weiß nicht warum.


1

Antwort basierend auf @ Meliza Ramos-Antwort (siehe erste Antwort) und http://php.net/manual/en/function.phpversion.php ,

AKTIONEN:

  • Definieren Sie PHP_VERSION_ID, falls nicht vorhanden
  • Definieren Sie eine Funktion zum Überprüfen der Version basierend auf PHP_VERSION_ID
  • Definieren Sie die Funktion für openSession () Secure

benutze nur openSession ()

    // PHP_VERSION_ID is available as of PHP 5.2.7, if our
    // version is lower than that, then emulate it
    if (!defined('PHP_VERSION_ID')) {
        $version = explode('.', PHP_VERSION);

        define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));


        // PHP_VERSION_ID is defined as a number, where the higher the number
        // is, the newer a PHP version is used. It's defined as used in the above
        // expression:
        //
        // $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
        //
        // Now with PHP_VERSION_ID we can check for features this PHP version
        // may have, this doesn't require to use version_compare() everytime
        // you check if the current PHP version may not support a feature.
        //
        // For example, we may here define the PHP_VERSION_* constants thats
        // not available in versions prior to 5.2.7

        if (PHP_VERSION_ID < 50207) {
            define('PHP_MAJOR_VERSION',   $version[0]);
            define('PHP_MINOR_VERSION',   $version[1]);
            define('PHP_RELEASE_VERSION', $version[2]);

            // and so on, ...
        }
    }

    function phpVersionAtLeast($strVersion = '0.0.0')
    {
        $version = explode('.', $strVersion);

        $questionVer = $version[0] * 10000 + $version[1] * 100 + $version[2];

        if(PHP_VERSION_ID >= $questionVer)
            return true;
        else
            return false;

    }

    function openSession()
    {
        if(phpVersionAtLeast('5.4.0'))
        {
            if(session_status()==PHP_SESSION_NONE)
                session_start();
        }
        else // under 5.4.0
        {
            if(session_id() == '')
                session_start();
        }
    }

1
if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
    $sess = session_status();
    if ($sess == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if (!$_SESSION) {
        session_start();
    }
}

Eigentlich ist es jetzt zu spät, es hier sowieso zu erklären, da es gelöst wurde. Dies war eine .inc-Datei eines meiner Projekte, in der Sie ein Menü für ein Restaurant konfigurieren, indem Sie ein Gericht auswählen und die Reihenfolge entfernen / hinzufügen oder ändern. Der Server, auf dem ich arbeitete, hatte nicht die aktuelle Version, daher habe ich ihn flexibler gestaltet. Es liegt an den Autoren, es zu nutzen und auszuprobieren.


1

Funktioniert dieses Code-Snippet für Sie?

if (!count($_SESSION)>0) {
    session_start();
}

0

Sie sollten Ihren Code so neu organisieren, dass Sie session_start()genau einmal pro Seitenausführung aufrufen.


4
In einigen Situationen ist es möglicherweise nicht erwünscht, es genau einmal pro Seitenausführung aufzurufen.
Timo Huovinen

Wenn Sie die Sitzung beenden, um sie neu zu erstellen, ist dies sicher ein Sonderfall. Im Allgemeinen sollte die Anwendung über Code verfügen, der am Anfang einmal ausgeführt wird. Dort wird session_start () abgelegt.
SamT

1
Beispielsweise speichert eine Anwendung Sitzungen in einer Datei und muss zwei gleichzeitige langsame Datenanforderungen laden. Keine dieser Anforderungen benötigt Sitzungen, aber eine blockiert die andere, da session_start die Sitzungsdatei sperrt.
Timo Huovinen

Genau. @ YuriKolovsky ist richtig. Die Frage von Alex ist relevant, weil diese Fälle auftreten können und sie nicht ungewöhnlich sind.
Paulo Coghi - Stellen Sie Monica

14
-1, Die meisten Websites sind CMS-gesteuert und enthalten Themen und Plugins, die häufig von verschiedenen Parteien geschrieben wurden, ohne zu wissen, ob der Code des jeweils anderen Sitzungen gestartet hat oder nicht. Die Implikation, dass dies nur ein Problem der Codeorganisation ist, ist falsch.
Jimbo Jonny

0
session_start();
if(!empty($_SESSION['user']))
{     
  //code;
}
else
{
    header("location:index.php");
}

0

PHP_VERSION_ID ist ab PHP 5.2.7 verfügbar. Überprüfen Sie dies also zuerst und erstellen Sie es gegebenenfalls. session_statusist ab PHP 5.4 verfügbar, daher müssen wir dies auch überprüfen:

if (!defined('PHP_VERSION_ID')) {
    $version = explode('.', PHP_VERSION);
    define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}else{
    $version = PHP_VERSION_ID;
}
if($version < 50400){
    if(session_id() == '') {
        session_start();
    }
}else{
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
}


0

Am Ende hatte ich eine doppelte Überprüfung des Status. PHP 5.4+

if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};

0

Mit der folgenden Lösung können Sie überprüfen, ob eine PHP-Sitzung bereits gestartet wurde:

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}

Die gültige Antwort ist detaillierter.
Clément Prévost

0

Dies ist, was ich benutze, um festzustellen, ob eine Sitzung gestartet wurde. Verwenden Sie leer und isset wie folgt:

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

-3

Ersetzen session_start();durch:

if (!isset($a)) {
    a = False;
    if ($a == TRUE) {
        session_start();
        $a = TRUE;
    }
}

Es enthält Codefehler und würde nur funktionieren, wenn dieselbe Datei mehrmals enthalten wäre, jedoch nicht, wenn sie sich in einem Abschluss befindet.
BananaAcid
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.