wake-up-neo.com

Wie kann ich feststellen, ob eine Sitzung aktiv ist?

Auf Anfrage gibt es verschiedene Möglichkeiten, um festzustellen, ob eine Sitzung gestartet wurde oder nicht, z.

$isSessionActive = (session_id() != "");

Oder:

$isSessionActive = defined('SID');

Beides schlägt jedoch fehl, wenn Sie eine Sitzung starten und sie dann schließen. session_id() gibt die ID der vorherigen Sitzung zurück, während SID definiert wird. Gleichermaßen wird beim Aufruf von session_start() an dieser Stelle ein E_NOTICE generiert, wenn bereits eine Sitzung aktiv ist. Gibt es eine vernünftige Methode, um zu überprüfen, ob eine Sitzung gerade aktiv ist, ohne auf Ausgabepufferung, den Shutup-Operator (@session_start()) oder etwas anderes als Hacker zurückgreifen zu müssen?

EDIT: Ich habe einen Patch geschrieben, um zu versuchen, diese Funktionalität in PHP aufzunehmen: http://bugs.php.net/bug.php?id=52982

EDIT 29.08.2011: Neue Funktion zu PHP 5.4 hinzugefügt, um dies zu beheben: "Sitzungsstatus über neue Funktion, Sitzungsstatus anzeigen" 

// as of 8/29/2011
$isSessionActive = (session_status() == PHP_SESSION_ACTIVE);

EDIT 05.12.11: session_status () im Handbuch PHP.

41
ken

Siehe Änderungen an der ursprünglichen Frage. Im Grunde hat PHP 5.4 und höher jetzt eine Funktion namens session_status() , um dieses Problem zu lösen!

"Sitzungsstatus über neue Funktion, Sitzungsstatus anzeigen" (SVN Version 315745)

Wenn Sie diese Funktionalität in einer Version vor PHP 5.4 benötigen, lesen Sie die Antwort von hakre .

22
ken

Um dieses Problem zu umgehen, habe ich ein paar Wrapper-Funktionen um die verschiedenen Funktionen zum Erstellen, Schließen und Zerstören von Sitzungen hinzugefügt. Grundsätzlich gilt:

function open_session() {
     session_start();
     $_SESSION['is_open'] = TRUE;
}

function close_session() {
   session_write_close();
   $_SESSION['is_open'] = FALSE;
}

function destroy_session() {
   session_destroy();
   $_SESSION['is_open'] = FALSE;
}

function session_is_open() {
   return($_SESSION['is_open']);
}

Hackish, aber vollbracht, was ich brauchte.

15
Marc B

Ich laufe auch darauf ein und eine Einstellung in $_SESSION ist für mich keine Option. Für PHP 5.3.8:

  1. Wenn mit der Anforderung eine Sitzung gestartet wurde, gibt define('SID')FALSE zurück, und $_SESSION wird nicht festgelegt.
  2. Dies ist unabhängig davon, ob session_id() zum Festlegen einer Sitzungs-ID verwendet wurde oder nicht.
  3. Nach dem ersten session_start() wird SID definiert und $_SESSION auf ein leeres Array gesetzt.
  4. session_destroy() löscht die session_id(), es ist also eine leere Zeichenfolge. SID bleibt definiert (und auf den vorherigen Wert gesetzt, der eine leere Zeichenfolge sein kann). $_SESSION bleibt unverändert. Beim nächsten Aufruf von session_start wird es zurückgesetzt/ausgefüllt.

Mit diesen Zuständen, insbesondere da session_id() dazwischen gesetzt werden kann, um die ID für die next -Sitzung festzulegen, ist es nicht möglich, den Sitzungsstatus mit SID, $_SESSION und session_id() sicher zu ermitteln.

"Versuchen" mit session_start() (z. B. mit @) ist möglicherweise nicht wirklich hilfreich, da dies den Sitzungsstatus ändert und den Inhalt von $_SESSION ändert (und einen Set-Cookie-Header hinzufügt, wenn der Cookie nicht Teil der Anforderung war). Es passte in meinem Fall nicht.

Während ich Tests durchführte, bin ich auf das Verhalten gestoßen, dass Sie nicht versuchen können, die Ini-Einstellung von session.serialize_handler zu ändern, wenn die Sitzung aktiv ist, auch nicht, wenn Sie denselben Wert festlegen. Gleiches gilt für session.use_trans_sidDocs welches leichter ist. Dies führte mich zu folgender Funktion:

/**
 * @return bool
 */
function session_is_active()
{
    $setting = 'session.use_trans_sid';
    $current = ini_get($setting);
    if (FALSE === $current)
    {
        throw new UnexpectedValueException(sprintf('Setting %s does not exists.', $setting));
    }
    $result = @ini_set($setting, $current); 
    return $result !== $current;
}

Soweit ich sehen kann, prüft der Fehler nur den Status der aktiven Sitzung (nicht deaktiviert). Daher sollte dies nicht zu einem falschen positiven Ergebnis führen, wenn Sitzungen deaktiviert sind.

Um diese Funktion mit PHP 5.2 kompatibel zu machen, bedarf es einiger Änderungen:

/**
 * @return bool
 */
function session_is_active()
{
    $setting = 'session.use_trans_sid';
    $current = ini_get($setting);
    if (FALSE === $current)
    {
        throw new UnexpectedValueException(sprintf('Setting %s does not exists.', $setting));
    }
    $testate = "mix$current$current";
    $old = @ini_set($setting, $testate);
    $peek = @ini_set($setting, $current);
    $result = $peek === $current || $peek === FALSE;
    return $result;
}

Einige Sandbox .

10
hakre

Der folgende Code erstellt nur eine session_id () für mich, nicht zwei

session_start();
echo session_id();
session_destroy();
echo session_id();

Wenn Sie immer noch Probleme damit haben, können Sie versuchen, eine Variable zu erstellen, die überprüft wird, ob Sie sie zerstören, wenn Sie die Sitzung löschen.

session_start();
$_SESSION['intialized'] = 'This will not print';
$_SESSION = array(); // Unset all variables
session_destroy();
echo $_SESSION['initialized']; // No output
4
Robert

Hier ist ein guter Ersatz, der das Zeug nicht kaputt macht, wenn Sie zu 5.4 wechseln:

if(!function_exists('session_status')){
    function session_active(){
        return defined('SID');   
    }
}else{
    function session_active(){
        return (session_status() == PHP_SESSION_ACTIVE);   
    }        
}
1
Beachhouse

Es gibt mehrere Stellen, an denen Sie überprüfen müssen, ob die Sitzung aktiv ist:

1 - Cookie ist vorhanden und nicht abgelaufen 2 - Der unterliegende Sitzungsspeichermechanismus (Dateisystem oder Datenbank) enthält einen Datensatz, der mit dem Cookie übereinstimmt.

0
beiller

Ken, wenn die Sitzung zerstört wird, sollte das $ _SESSION-Array nicht verfügbar sein ... oder zumindest sollten Ihre Werte nicht festgelegt sein. Theoretisch (ungetestet) sollten Sie also in der Lage sein, das Array auf einen Wert zu überprüfen, um festzustellen, ob aktuell etwas festgelegt ist.

0
bpeterson76